Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.11;
Скачать: CL | DM;

Вниз

Что выполняется быстрее ?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.018 c
7-33378
BJValentine
2003-05-28 10:52
2003.08.11
Tray+Reboot


1-33095
Alex-21
2003-07-28 21:30
2003.08.11
Два окна


14-33311
b0bi
2003-07-24 15:33
2003.08.11
Определение объёма по плоскому изображению


11-33089
asp
2002-12-01 22:08
2003.08.11
TabControl


8-33231
Njes
2003-04-16 10:10
2003.08.11
Копирование прямоугольной области в TBitmap