Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-33213
NetKnight
2003-07-28 16:32
2003.08.11
Как побитно записать инфу в тип Cardinal?


3-33044
tamara
2003-07-17 15:43
2003.08.11
КАК ВЫДЕЛИТЬ ЦВЕТОМ СТРОКИ DBGrid


6-33245
Ghost
2003-06-04 10:45
2003.08.11
Определить какому каталогу соответствует открытый ресурс


3-33070
M126
2003-07-18 08:41
2003.08.11
Копирование из одной базы в другую


1-33141
Otter
2003-07-28 03:34
2003.08.11
Как присвоить подпрограмму????





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский