Burster_TIL писал(а): Но между Т1 и Т2 в обеих случая располагается один и тот же код. И этот один и то же код выполняется по разному. Вот это и удивляет. При чём с точки зрения производительности в Delphi что есть дополнительный вложенный цикл, что нет его результат один и тот же в районе 1970 тиков. В ХЕ2 скорость выполнения такой же программы и вовсе плавает от тех же 1970 до аж 10000.
То что располагается один и тот же текст (специально заменил слово "код" на "текст"), с точки зрения человека
, ещё не означает, что в результате будет один и тот же код, с точки зрения компилятора.
Понятие "один и тот же текст" программы, может только означать, что результат выполнения должен быть одинаковым, как это гарантируется стандартом языка.
"Если написать так-то, то результат будет такой-то".
Но вот скорость с которым результат будет доставлен, стандартами языка никак не гарантируется. Очевидно, что всё зависит как от железа, которое будет исполнять код, так и от компилятора, который исполняемый код сгенерирует из исходного текста.
И ещё раз, для закрепления.
Для одного и того же
текста программы, разные компиляторы могут генерировать разные исполняемый
код. Скорость исполнения такого
кода может быть разной.
Компиляторы генерируют разный
код, потому что компиляторы написаны разными людьми. Нету единого стандарта о том, какой
код должен сгенерировать компилятор. Есть требования к компилятору, о том, какой должен быть результат исполнения текста программы (а точнее инструкций языка программирования).
А т.к. у каждого разработчика комиляторов свой взгляд, на то как должен быть устроен компилятор, и что в нём важнее, то и результат работы у каждого компилятора разный.
НО, конечного программиста, который использует компилятор (а не разрабатывает компилятор), в идеале, результирующий код волоновать не должен, пока стандарт языка соблюдается. И если уж человек лезет с измерениями через RDTSC, то будь добр разбиратся в тонкостях генерации кода, конкретной версии компилятора
Добавлено спустя 6 минут 59 секунд:Но давайте рассмотрим такой вот простенький тест
- Код: Выделить всё
{$apptype console}
{$ifdef FPC}
{$mode delphi}
{$endif}
FUNCTION Get__RDTSC:Int64;ASSEMBLER;REGISTER;
Asm
RDTSC
End;
function DoTest(var res: double): Int64;
var
f: double;
i :integer;
t1,t2 : Int64;
Begin
f:=0;
T1:=Get__RDTSC;
for i:=0 to 1000 do
f:=f*i;
T2:=Get__RDTSC;
Result:=T2-T1;
res:=f;
end;
var
f : double;
t : Int64;
begin
t:=DoTest(f);
writeln(t);
writeln(f:0:4);
end.
FPC без оптимизаций и без использования всяких там MMX или XMM или SSE (в которые делфи не умеет), выдаёт на гора
11000
а Delphi 7
18000
а какой-нить хитрый-Сишный компилятор, вообще
бы выкинул
бы весь цикл

вернув значение времени, примерно
1000,
а то и меньше.