Соответствует ли действительности то, что компилятор Object Pascal в
Delphi лучше компилятора C++ в C++Builder? Для эксперимента я создал два
проекта на С++Builder и Delphi соответственно, и всего навсего в процедуре
обрабатывающей нажатие на кноку задал пустой цикл от 1 до 1 миллиарда:
1. Программно-аппаратное обеспечение.
CPU: Duron 700 МГц
FSB: 200 МГц
RAM: 128Мб SDRAM133/CAS=2/6нс.
Система: Windows2000Pro RUS
IDEs: Borland Delphi 5.0 Enterprise; Borland JBuilder 5.0 Personal (JDK1.3.0_02 Java Compiler).
2. Коды тестов:
Borland Delphi 5.0 Enterprise:
procedure TForm1.Test1ButtonClick(Sender: TObject);
var
t: TDateTime;
i: Integer;
h, m, s0, s, ms0, ms: Word;
ds, dms: Word;
begin
t := Time;
DecodeTime(t, h, m, s0, ms0);
Label1.Caption := 'Одиночный цикл с оптимизацией компилятором.';
for i := 1 to 1000000000 do ;
t := Time;
DecodeTime(t, h, m, s, ms);
ds := s - s0;
Label2.Caption := 'Длительность: ' + IntToStr(ds) + ' с ';
end;
procedure TForm1.Test2ButtonClick(Sender: TObject);
var
t: TDateTime;
b, c: Integer;
h, m, s0, s, ms0, ms: Word;
ds, dms: Word;
begin
c := 0;
t := Time;
DecodeTime(t, h, m, s0, ms0);
Label1.Caption := 'Одиночный цикл без оптимизации компилятором.';
for b := 1 to 1000000000 do c := b - 1;
t := Time;
DecodeTime(t, h, m, s, ms);
ds := s - s0;
Label2.Caption := 'Длительность: ' + IntToStr(ds) + ' с ';
Label3.Caption := 'Переменные цикла на выходе: ' + 'b=' + IntToStr(b) + '; c=' + IntToStr(c);
end;
procedure TForm1.Test3ButtonClick(Sender: TObject);
var
t: TDateTime;
d, e, f, g: Integer;
h, m, s0, s, ms0, ms: Word;
ds, dms: Word;
begin
t := Time;
DecodeTime(t, h, m, s0, ms0);
Label1.Caption := 'Тройной цикл без оптимизации компилятором.';
for d := 1 to 1000 do begin
g := d - 1;
for e := 1 to 1000 do
for f := 1 to 1000 do ;
end;
t := Time;
DecodeTime(t, h, m, s, ms);
ds := s - s0;
Label2.Caption := 'Длительность: ' + IntToStr(ds) + ' с ';
Label3.Caption := 'Переменные цикла на выходе: ' + 'd=' + IntToStr(d) + '; e=' + IntToStr(e) + '; f=' + IntToStr(f) + '; g=' + IntToStr(g);
end;
JBuilder5Personal (Java JDK1.3.0_02):
public class Untitled1 {
public Untitled1() {
}
public static void main(String[] args) {
{
System.out.println("Одиночный цикл с оптимизацией компилятором.");
int a = 0;
long t1 = System.currentTimeMillis();
for (a = 0; a < 1000000000; a++);
t1 = System.currentTimeMillis() - t1;
System.out.println("Длительность: " + t1 + " мс");//Длительность: 4346 мс
System.out.println("Переменная цикла на выходе: " + "a=" + a);
} {
System.out.println("Одиночный цикл без оптимизации компилятором.");
int b = 0, c = 0;//Объявляем новые переменные -- исключаем кэширование старых
long t2 = System.currentTimeMillis();
for(b = 0; b < 1000000000; b++) c = b - 1;//Исключаем оптимизацию компилятором
t2 = System.currentTimeMillis() - t2;
System.out.println("Длительность: " + t2 + " мс");//Длительность: 6720 мс
System.out.println("Переменные цикла на выходе: " + "c=" + c + "; " + "b=" + b);
} {
System.out.println("Тройной цикл без оптимизации компилятором.");
int d = 0, e = 0, f = 0, g = 0;//Объявляем новые переменные -- исключаем кэширование старых
long t3 = System.currentTimeMillis();
for(d = 0; d < 1000; d++) {
g = d - 1;//Исключаем оптимизацию компилятором
for(e = 0; e < 1000; e++)
for(f = 0; f < 1000; f++);
}
t3 = System.currentTimeMillis() - t3;
System.out.println("Длительность: " + t3 + " мс");//Длительность: 7260 мс
System.out.println("Переменные цикла на выходе: " + "d=" + d + "; " + "e=" + e + "; " + "f=" + f + "; " + "g=" + g);
}
}
}
Результат выполнения в Delphi5.0:
Одиночный цикл с оптимизацией компилятором.
Длительность: 5 сек.
Одиночный цикл без оптимизации компилятором.
Длительность: 3 сек.
Тройной цикл без оптимизации компилятором.
Длительность: 3 сек.
Результат выполнения в JBuilder5.0:
Одиночный цикл с оптимизацией компилятором.
Длительность: 4.3 с
Одиночный цикл без оптимизации компилятором.
Длительность: 6.7 с
Тройной цикл без оптимизации компилятором.
Длительность: 7.3 с
3. Комментарии и выводы:
0) При компиляции проекта включено "Debug Info", оптимизация выключена.
1) Непонятно поведение программы на Delphi: иногда она выдавала длительность от 3 до 5 с во всех тестах, несколько раз аж 65480 с (что за глюк, ведь работала положенное время 3-5 с) ?!
2) Delphi/Java -- паритет по одиночному циклу.