Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];

Вниз

Читабельно или красиво - что приоритетнее?   Найти похожие ветки 

 
Marser ©   (2006-09-19 22:56) [40]

> [39] Petr V. Abramov ©   (19.09.06 22:54)
> > Marser ©   (19.09.06 19:46)  
> > b:=integer(not(st[1]=#$7E))+1;
> ты ловко подметил пример т.н. вые...на. А уж как лучше
> - в стиле примера или без - решать каждому самому :)

А я таким нехитрым способом отучаю себя бояться форумной критики :-)
Потому что в реальном коде реализовал через if :-))


 
Alx2 ©   (2006-09-19 22:56) [41]

Сейчас будет состязание на самый короткий и/или быстрый код :)


 
Marser ©   (2006-09-19 23:02) [42]

> [41] Alx2 ©   (19.09.06 22:56)
> Сейчас будет состязание на самый короткий и/или быстрый
> код :)

Чапаев пока рекордсмен. По его наводке :-)
b:=ord(st[1]<>#$7E)+1;


 
SergP ©   (2006-09-19 23:04) [43]

> [40] Marser ©   (19.09.06 22:56)
> > [39] Petr V. Abramov ©   (19.09.06 22:54)
> > > Marser ©   (19.09.06 19:46)  
> > > b:=integer(not(st[1]=#$7E))+1;
> > ты ловко подметил пример т.н. вые...на. А уж как лучше
>
> > - в стиле примера или без - решать каждому самому :)
>
> А я таким нехитрым способом отучаю себя бояться форумной
> критики :-)
> Потому что в реальном коде реализовал через if :-))


А все-таки тот другой код не мешало бы держать где-то поблизости (в коментариях) чтобы при возникновении ситуации [14] можно было все быстро и без проблем поменять...


 
guav ©   (2006-09-19 23:05) [44]

b:=succ(sign(word($7E-byte(st[1]))))
:-P


 
SergP ©   (2006-09-19 23:08) [45]

> Чапаев пока рекордсмен. По его наводке :-)
> b:=ord(st[1]<>#$7E)+1;


Это по кол-ву буковков?


 
Petr V. Abramov ©   (2006-09-19 23:11) [46]

> Marser ©   (19.09.06 22:56) [40]
> А я таким нехитрым способом отучаю себя бояться форумной критики :-)
> Потому что в реальном коде реализовал через if :-))
 я и не сомневался. пост был написан "другим в науку" на прекрасном примере, любезно Вами предоставленном :-))


 
Marser ©   (2006-09-19 23:12) [47]

> [46] Petr V. Abramov ©   (19.09.06 23:11)
> > Marser ©   (19.09.06 22:56) [40]
> > А я таким нехитрым способом отучаю себя бояться форумной
> критики :-)
> > Потому что в реальном коде реализовал через if :-))
> я и не сомневался. пост был написан "другим в науку" на
> прекрасном примере, любезно Вами предоставленном :-))

Пример конкретный, а на общий вопрос ответов практически не было.


 
guav ©   (2006-09-19 23:23) [48]

> на общий вопрос ответов практически не было.

Как же, см. первый же ответ.

Могу ещё раз ответить если надо
> Так что оптимальнее? То, что понятнее, прозрачнее и проще
> расширяется, или то, что красиво для тебя сейчас или врамках
> некоего обего трюкачества?

Красиво как раз то что понятнее, прозрачнее и проще, а с трюкачеством следует боротся.

А насчёт трюкачества

> Проверено, в общем-то не раз, правда, обычно я привожу к
> byte

> Мне, кстати, сишных фич с выражениями иногда не хватает.

Похоже склонность таки есть :-)


 
Eraser ©   (2006-09-19 23:24) [49]

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Math;

type
 TForm1 = class(TForm)
   btnTest1: TButton;
   lbTime: TLabel;
   btnTest2: TButton;
   procedure btnTest2Click(Sender: TObject);
   procedure btnTest1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

const
 InterationCount = 100000000;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnTest1Click(Sender: TObject);
var
 st: string;
 i, b: Integer;
 dt1: TDateTime;
begin
 st := "test";
 dt1 := Now;
 for i := 0 to InterationCount do
   //b := ord(st[1] <> #$7E) + 1;
   b := Integer(not(st[1] = #$7E)) + 1;

 dt1 := Now - dt1;
 // Чтобы не ругался компилятор :)
 TButton(Sender).Caption := "Test1" + IntToStr(b);
 lbTime.Caption := FormatDateTime("ss - zzz", dt1);
end;

procedure TForm1.btnTest2Click(Sender: TObject);
var
 st: string;
 i, b: Integer;
 dt1: TDateTime;
begin
 st := "test";
 dt1 := Now;
 for i := 0 to InterationCount do
 begin
   if st[1] = #$7E then
     b := 1
   else
     b := 2;
 end;
 dt1 := Now - dt1;
 // Чтобы не ругался компилятор :)
 TButton(Sender).Caption := "Test2" + IntToStr(b);
 lbTime.Caption := FormatDateTime("ss - zzz", dt1);
end;

end.

на моем Атлоне3000 первый вариант выполняется в среднем за 220 мс, второй за 340 мс.
если количесво интераций сделать хотя бы на порядок меньше, то разницы нету.
:-)


 
Eraser ©   (2006-09-19 23:26) [50]

вариант с b := ord(st[1] <> #$7E) + 1; - 160 мс.


 
guav ©   (2006-09-19 23:33) [51]

> на моем Атлоне3000 первый вариант выполняется в среднем
> за 220 мс, второй за 340 мс.

Удивился что b := Integer(not(st[1] = #$7E)) + 1; быстрее, проверил у себя - у меня наоборот 320 первый 220 второй.
[50] - 250.

Celeron 2000.


 
Marser ©   (2006-09-19 23:33) [52]

> Похоже склонность таки есть :-)

Но так глубоко я не залазил раньше и сейчас не залез. Просто если по галочке в пакете формируется ноль или единица, то так всё-таки удобнее, вроде byte(some_chb.Checked)


 
Eraser ©   (2006-09-19 23:38) [53]

> [51] guav ©   (19.09.06 23:33)

может компиляторы разные.. у меня БДС2006.

вот ассемблер 1 примера:

Unit1.pas.40: for i := 0 to InterationCount do
0045472E B801E1F505       mov eax,$05f5e101
Unit1.pas.41: b := ord(st[1] <> #$7E) + 1;
00454733 8B55FC           mov edx,[ebp-$04]
00454736 803A7E           cmp byte ptr [edx],$7e
00454739 0F95C3           setnz bl
0045473C 83E37F           and ebx,$7f
0045473F 43               inc ebx
Unit1.pas.40: for i := 0 to InterationCount do
00454740 48               dec eax
00454741 75F0             jnz $00454733
Unit1.pas.44: dt1 := Now - dt1;
00454743 E88056FBFF       call Now


вот второго:

Unit1.pas.58: for i := 0 to InterationCount do
00454836 B801E1F505       mov eax,$05f5e101
Unit1.pas.60: if st[1] = #$7E then
0045483B 8B55FC           mov edx,[ebp-$04]
0045483E 803A7E           cmp byte ptr [edx],$7e
00454841 7507             jnz $0045484a
Unit1.pas.61: b := 1
00454843 BB01000000       mov ebx,$00000001
00454848 EB05             jmp $0045484f
Unit1.pas.63: b := 2;
0045484A BB02000000       mov ebx,$00000002
Unit1.pas.58: for i := 0 to InterationCount do
0045484F 48               dec eax
00454850 75E9             jnz $0045483b
Unit1.pas.66: dt1 := Now - dt1;
00454852 E87155FBFF       call Now


 
Eraser ©   (2006-09-19 23:40) [54]

вот вариант с b := Integer(not(st[1] = #$7E)) + 1; как в первом примере [49].

Unit1.pas.40: for i := 0 to InterationCount do
0045472E B801E1F505       mov eax,$05f5e101
Unit1.pas.42: b := Integer(not(st[1] = #$7E)) + 1;
00454733 8B55FC           mov edx,[ebp-$04]
00454736 803A7E           cmp byte ptr [edx],$7e
00454739 0F94C3           setz bl
0045473C 80F301           xor bl,$01
0045473F 83E37F           and ebx,$7f
00454742 43               inc ebx
Unit1.pas.40: for i := 0 to InterationCount do
00454743 48               dec eax
00454744 75ED             jnz $00454733
Unit1.pas.44: dt1 := Now - dt1;
00454746 E87D56FBFF       call Now


 
guav ©   (2006-09-19 23:41) [55]


> [52] Marser ©   (19.09.06 23:33)

> Просто если по галочке в пакете формируется ноль или единица,
> то так всё-таки удобнее, вроде byte(some_chb.Checked)

На этот случай часто удобнее вариант [12] , т.к. более гибкий


> [53] Eraser ©   (19.09.06 23:38)

Нет, код такой же, дело в процессоре.


 
Zeqfreed ©   (2006-09-19 23:42) [56]

Ещё надо посчитать вариант с if. Думается мне, что он не будет уступать «быстрым» вариантам :)


 
KilkennyCat ©   (2006-09-19 23:43) [57]

Мне бы ваши проблемы... у меня серъезная травма ног часов на шесть еще, последние патроны истратил на мара сразу при входе в шахту...


 
Eraser ©   (2006-09-19 23:44) [58]

> [56] Zeqfreed ©   (19.09.06 23:42)

дык посчитан - второй вариант в примерах оно и есть )

а вот если использовать вызов Math.IfThen то вообще около 500 мс выходит.. ну это и не удивительно )


 
default ©   (2006-09-19 23:46) [59]

тяжёлый случай


 
Zeqfreed ©   (2006-09-19 23:50) [60]

> [58] Eraser ©   (19.09.06 23:44)

Да, действительно :) Извиняюсь.


 
Marser ©   (2006-09-20 00:23) [61]

> [55] guav ©   (19.09.06 23:41)
>
> > [52] Marser ©   (19.09.06 23:33)
>
> > Просто если по галочке в пакете формируется ноль или единица,
>
> > то так всё-таки удобнее, вроде byte(some_chb.Checked)
>
> На этот случай часто удобнее вариант [12] , т.к. более гибкий

Ну и зачем мне гибкость при работе с галочкой? Я по работе всё-таки больше занимаюсь не кодоблудием как в сабже, мне с "чёрным ящиком" приходится дело иметь.


 
guav ©   (2006-09-20 01:16) [62]

> [61] Marser ©   (20.09.06 00:23)

Ну тогда для 0..1 вариант вроде ord(some_chb.Checked) вполне допустим. Но я всё равно за if .


 
Тугодум ©   (2006-09-20 09:05) [63]

Marser ©   (19.09.06 19:46)  

b:=integer(not(st[1]=#$7E))+1;

b:=Ord(not(st[1]=#$7E))+1;

И будет гарантия правильной работы.


 
Чапаев ©   (2006-09-20 09:34) [64]

> Чапаев пока рекордсмен. По его наводке :-)
>

Ещё одно улучшение: b:=ord(st[1]<>127)+1;
Сэкономлен один символ исходного кода...


 
Lamer@fools.ua ©   (2006-09-20 09:49) [65]

>>Чапаев ©   (20.09.06 09:34) [64]

>Сэкономлен один символ исходного кода...
Вот это как раз и неправильно. Как же потом меряться, у кого проект... э-э-э... толще и длинее? ;o)


 
Marser ©   (2006-09-20 09:51) [66]

> [65] Lamer@fools.ua ©   (20.09.06 09:49)
> >>Чапаев ©   (20.09.06 09:34) [64]
>
> >Сэкономлен один символ исходного кода...
> Вот это как раз и неправильно. Как же потом меряться, у
> кого проект... э-э-э... толще и длинее? ;o)

Правильно! Я люблю, чтобы поменьше :-)
Побольше надо в другом месте, но там уж кому как повезёт :-)

> [63] Тугодум ©   (20.09.06 09:05)
> Marser ©   (19.09.06 19:46)  
>
> b:=integer(not(st[1]=#$7E))+1;
>
> b:=Ord(not(st[1]=#$7E))+1;
>
> И будет гарантия правильной работы.

Гарантия и так есть, а вообще, читайте ветку, это уже было.


 
Яся   (2006-09-20 09:53) [67]

Не жертвуйте ясностью ради небольших выгод эффективности
(С) Кнут


 
Наиль ©   (2006-09-20 09:54) [68]


> Ещё одно улучшение: b:=ord(st[1]<>127)+1;

b:=ord(st[1]<>#127)+1;


 
Чапаев ©   (2006-09-20 09:59) [69]

> [68] Наиль ©   (20.09.06 09:54)

шъйорт побьеры... :-(


 
Virgo_Style ©   (2006-09-20 10:06) [70]

st -> s

b:=ord(s[1]<>#127)+1;

еще ~4.5%


 
Игорь Шевченко ©   (2006-09-20 10:39) [71]

TRUE действительно бывает равно -1, в типе LongBool, например.

Писать код надо так, чтобы любой рядовой необученный программист не ломал голову над кодом, а сразу мог понять логику участка программы.

Всех, кто пишет "ловко" в одну строчку, надо бить палкой по пяткам до полного просветления.


 
Тугодум ©   (2006-09-20 13:03) [72]

Marser ©   (20.09.06 09:51) [66]

Нет, гарантии нет. А вообще-то я не зря себе ник выбрал :)


 
SergP ©   (2006-09-20 13:18) [73]

> [70] Virgo_Style ©   (20.09.06 10:06)
> st -> s
>
> b:=ord(s[1]<>#127)+1;
>
> еще ~4.5%


В таком случае:

b:=2-ord(s[1]=#127);

еще один символ съэкономлен... :-)


 
SergP ©   (2006-09-20 13:21) [74]

> [73] SergP ©   (20.09.06 13:18)
> > [70] Virgo_Style ©   (20.09.06 10:06)
> > st -> s
> >
> > b:=ord(s[1]<>#127)+1;
> >
> > еще ~4.5%
>
>
> В таком случае:
>
> b:=2-ord(s[1]=#127);
>
> еще один символ съэкономлен... :-)


Только правда в сабже было $7E , а это не 127, а 126

А вот и экономия еще одного символа:

b:=2-ord(s[1]="~");

:-)))


 
Ketmar ©   (2006-09-20 15:48) [75]

по сабжу. %-)
подобными конструкциями я "болел", когда писал на basic"е для Speccy. там это -- нормальная практика. когда поработал в команде -- меня от этого отучили быстро и больно. %-)


 
ZeroDivide ©   (2006-09-20 16:56) [76]

default ©   (19.09.06 21:39) [33]
В натуре LMD можно вписывать.



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.61 MB
Время: 0.05 c
15-1158354038
developer2006
2006-09-16 01:00
2006.10.15
расделить OnClick и неведение для MenuItem


15-1159249195
Новичоккк
2006-09-26 09:39
2006.10.15
Вопрос по FastScript


4-1148931253
Ihor Osov'yak
2006-05-29 23:34
2006.10.15
win32 subsystem on win64, RegRestoreKey


4-1149009608
Варяг
2006-05-30 21:20
2006.10.15
Загрузка и отображение картинки


15-1159188089
Crazy monkey
2006-09-25 16:41
2006.10.15
TES4: Oblivion. Чем все закончилось?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский