Форум: "Основная";
Текущий архив: 2003.08.11;
Скачать: [xml.tar.bz2];
ВнизЧто выполняется быстрее ? Найти похожие ветки
← →
Nucl (2003-07-28 17:09) [0]справедливо ли следующее:
var a:string;
if a <> "" then медленее чем if length(a) <> 0
← →
Ihor Osov'yak (2003-07-28 17:16) [1]if a <> "" компилируется в две ассемблерные комманды, (a - глобальная)
if length(a) - в четыре, причем одна из них вызов процедуры LStrLen..
Поэтому вероятнее всего if a <> "" значительно быстрее. Для точного ответа нужно поставить эксперимент, а на это сейчас времени нет.
← →
han_malign (2003-07-28 17:19) [2]pointer(a)<>pointer(константа "") или integer(pointer(a-4)^)<>0
← →
Ihor Osov'yak (2003-07-28 17:37) [3]2 han_malign © (28.07.03 17:19)
Все же Ctrl+Alt+C смотреть иногда нужно.
1.
cmp dword ptr[1],$00
jz траля-ля1
2.
mov eax,[a]
call @LStrLen
test eax,eax
jz траля-ля2
Компилятор, он как-бы оптимизирующий..
← →
Nucl (2003-07-28 18:22) [4]странное дело, для VB утверждают что это верно
← →
Region (2003-07-28 18:37) [5]Кто утверждает?
← →
Ihor Osov'yak (2003-07-28 19:28) [6]2 Nucl © (28.07.03 18:22)
А о VB здесь никто спич не вел. И код там не посмотришь, вероятнее всего. Только експеримент.
← →
Anatoly Podgoretsky (2003-07-28 19:48) [7]Nucl © (28.07.03 18:22)
Почему не хочешь проверить натурный эксперимент?
Или посмотреть сгенерированный код?
← →
Nucl (2003-07-29 01:23) [8]сравнил на следующем простом примере, действительно первый вариант быстрее.
var
StartTime, StopTime : Ttime;
i : longint;
DataVar : string;
begin
DataVar := "zzz";
StartTime := Time;
for i := 0 to 47483646 do
begin
if DataVar <> "" then DataVar := "zzz";
end;
StopTime := Time;
Label1.Caption := FormatDateTime("hh.mm.ss.zzz",StopTime - StartTime);
StartTime := Time;
for i := 0 to 47483646 do
begin
if Length(DataVar) <> 0 then DataVar := "zzz";
end;
StopTime := Time;
Label2.Caption := FormatDateTime("hh.mm.ss.zzz",StopTime - StartTime);
← →
Ihor Osov'yak (2003-07-29 01:54) [9]2 Nucl © (29.07.03 01:23)
А ты числа конкретные приведи.. Время и ЦП.
Не ленись.. Я вот не ленился "теоритическое" обоснование привести.. Ну а ты дай практический результат.
← →
Ihor Osov'yak (2003-07-29 01:57) [10]
И еще сделай експеримент для случая, когда DataVar будет не локальной, а глобальной, и когда полем класса.
← →
Nucl (2003-07-29 09:26) [11]Опа ! а результаты-то интересные получаются:
Результаты сравнения на 100.000.000 однотипных операций из примера выше на PIII-800 512Mb Ram:
если DataVar объявлена в теле процедуры:
1-й вариант сравнения: 00.00. 06.140
2-й вариант сравнения: 00.00. 06.125 !!!
если DataVar объявлена как глобальная:
1-й вариант сравнения: 00.00. 54.344 !!!
2-й вариант сравнения: 00.00. 58.531
если DataVar является полем класса:
1-й вариант сравнения: 00.00. 54.360 !!!
2-й вариант сравнения: 00.00. 57.968
← →
Anatoly Podgoretsky (2003-07-29 10:27) [12]Nucl © (29.07.03 09:26)
Изначально неверный подход к измерению, зачем портишь результаты измерения вот этой штукой then DataVar := "zzz";
Исключи и замени на then ;
← →
Nucl (2003-07-29 10:37) [13]без DataVar := "zzz"
если DataVar объявлена в теле процедуры:
1-й вариант сравнения: 00.00.00.469 !!!
2-й вариант сравнения: 00.00.01.218
если DataVar объявлена как глобальная:
1-й вариант сравнения: 00.00.00.312 !!!
2-й вариант сравнения: 00.00.01.188
если DataVar является полем класса:
1-й вариант сравнения: 00.00.00.316 !!!
2-й вариант сравнения: 00.00.01.062
что и требовалось доказать Ж)
← →
VMcL (2003-07-29 11:40) [14]Надеюсь у тестового приложения был установлен приоритет не ниже HIGH_PRIORITY_CLASS?
← →
pasha_golub (2003-07-29 11:44) [15]А если попробовать integer(S[0])? Где S:string;
PS Хотя это только для коротких строк, AFAIK
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.08.11;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c