Форум: "Прочее";
Текущий архив: 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.045 c