Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
del3d
Зарегистрирован: 04.06.2005 Сообщения: 28
|
Добавлено: Сб Июн 04 2005 12:17 Заголовок сообщения: С++Builder лействительно медленее Delphi? |
|
|
Посоветуйте, пожалуйста, язык программирования. Знаю Delphi, хочу заняться программированием 3D графики. Слышал, что C++ быстрее. Вчера решил проверить. Установил C++Builder6 и написал следующую программку:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
unsigned short int i, j, d;
d=1;
for (i=1; i<=30000; i++)
for (j=1; j<=30000; j++)
{
d=d*5;
}
Edit1->Text="del3d";
}
Данная процедура выполнялась порядка 7 секунд. На Delphi7 аналогичная процедура выполняется за 2.5 секунды. C++Builder действительно такой медленный? Есть ли существенная разница в скорости выполнения 3D приложения между этими языками? |
|
Вернуться к началу |
|
|
DmitryShm
Зарегистрирован: 17.11.2003 Сообщения: 211 Откуда: Казань
|
Добавлено: Сб Июн 04 2005 13:40 Заголовок сообщения: вопрос |
|
|
Ты какие опции компилятора использовал? Вообще, фраза Delphi быстрее/медленнее С++ Builder как минимум некорректна. Все зависит от инструментов, которыми пользуешься. Delphi или С++ -- всего-лишь языковые нотации. _________________ love IT |
|
Вернуться к началу |
|
|
LuckyELF
Зарегистрирован: 06.03.2005 Сообщения: 4 Откуда: Россия, Ростовская обл., Каменск
|
Добавлено: Сб Июн 04 2005 22:49 Заголовок сообщения: Re: вопрос |
|
|
DmitryShm писал(а): | Ты какие опции компилятора использовал? Вообще, фраза Delphi быстрее/медленнее С++ Builder как минимум некорректна. Все зависит от инструментов, которыми пользуешься. Delphi или С++ -- всего-лишь языковые нотации. |
Как раз делфи это среда разработки, а С++ концептуальный язык.
Опции компилятора действительно сильно влияют на работу, тем более что по умолчанию в билдере стоит без оптимизации + дебаг версия, не считая других настроек.
Если хочешь писать 3д пиши на MS Visual Studio.net |
|
Вернуться к началу |
|
|
Wladimir
Зарегистрирован: 02.03.2005 Сообщения: 150 Откуда: Ставропольский край
|
Добавлено: Вс Июн 05 2005 15:20 Заголовок сообщения: |
|
|
Цитата: | Как раз делфи это среда разработки, а С++ концептуальный язык. |
На тему "язык ли дельфи?" нет единого мнения даже на дельфикингдоме. Это - одна из священных недоказуемых аксиом. Смотря, что вкладывать в понятия "язык" и "дельфи".
Присоединяюсь к мнению предыдущих ораторов насчёт настроек. (Хотя, кстати, в дельфях ттоже есть птичка "оптимизация").
Судя по любопытному синтаксису приведённого примера по сравнению со, скажем:
Код: |
for (int i=1, j, d = 1; i<=30000; i++)
for (j=1; j<=30000; j++, d *= 5);
|
, он, возможно, взят из книжки по ДОСовским сям. Т.е. в нём int==short. Сейчас int != short.
В дельфозном варианте ты использовал Integer (т.е. int) или SmallInt (т.е. short).
Попробуй свой пример с int в C++ и SmallInt в дельфях.[/quote] |
|
Вернуться к началу |
|
|
del3d
Зарегистрирован: 04.06.2005 Сообщения: 28
|
Добавлено: Вс Июн 05 2005 17:46 Заголовок сообщения: |
|
|
Цитата: |
Т.е. в нём int==short. Сейчас int != short.
В дельфозном варианте ты использовал Integer (т.е. int) или SmallInt (т.е. short).
Попробуй свой пример с int в C++ и SmallInt в дельфях.
|
В Делфях и в Билдере я использовал один и тотже тип (от -2147483648 до 2147483647). Соответственно это Integer и Int. Хотя это не имеет большого значения (для данного цикла), в Делфях подобные циклы все ровно выполняются на много быстрее.
Вы говорите об опциях компилятора. Какие опции в Билдере нужно использовать, чтобы подобный цикл, стал выполняться раза в 3 быстрее?
У меня Делфи7 и С++Билдер6. |
|
Вернуться к началу |
|
|
LuckyELF
Зарегистрирован: 06.03.2005 Сообщения: 4 Откуда: Россия, Ростовская обл., Каменск
|
Добавлено: Пн Июн 06 2005 12:23 Заголовок сообщения: |
|
|
Итак собственно перейдем от слов к делу, значится взял я Delphi 7.0, С++ Builder 6.0 и MS Visual Studio.net, написал такой код
(Delphi 7.0): на форме 2 едита и 2 баттона.
Код: | unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Edit2: TEdit;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
Var
I, J, D : Integer;
T_Start, T_Stop, T : Integer;
begin
T_Start := GetTickCount ();
D := 1;
For I := 1 To 30000 Do
For J := 1 To 30000 Do
D := D * 5;
T_Stop := GetTickCount ();
T := T_Stop - T_Start;
Edit1.Text := IntToStr (T);
end;
procedure TForm1.Button2Click(Sender: TObject);
Var
I, J, D : Integer;
T_Start, T_Stop, T : Integer;
begin
T_Start := GetTickCount ();
D := 1;
For I := 1 To 30000 Do
For J := 1 To 30000 Do
Begin
D := D * 5;
End;
T_Stop := GetTickCount ();
T := T_Stop - T_Start;
Edit2.Text := IntToStr (T);
end;
end. |
еще одно приложение было консольное:
Код: | program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows;
Var
I, J, D : Integer;
T_Start, T_Stop, T : Integer;
begin
{ TODO -oUser -cConsole Main : Insert code here }
writeln ('press any key to start...'); readln;
T_Start := GetTickCount ();
D := 1;
For I := 1 To 30000 Do
For J := 1 To 30000 Do
D := D * 5;
T_Stop := GetTickCount ();
T := T_Stop - T_Start;
WriteLn ('Test1 :', T);
T_Start := GetTickCount ();
D := 1;
For I := 1 To 30000 Do
For J := 1 To 30000 Do
Begin
D := D * 5;
End;
T_Stop := GetTickCount ();
T := T_Stop - T_Start;
WriteLn ('Test2 :', T);
readln;
end. |
Далее для билдера (на форме также 2 едита и 2 баттона):
Код: | //---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
DWORD t_start, t_stop, t;
unsigned short int i, j, d;
t_start = GetTickCount ();
d=1;
for (i=1; i<=30000; i++)
for (j=1; j<=30000; j++)
{
d=d*5;
}
t_stop = GetTickCount ();
t = t_stop - t_start;
Edit1->Text = IntToStr (t);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
DWORD t_start, t_stop, t;
t_start = GetTickCount ();
for (int i=1, d=1; i<=30000; i++)
for (int j=1; j<=30000; j++, d*=5);
t_stop = GetTickCount ();
t = t_stop - t_start;
Edit2->Text = IntToStr (t);
}
//--------------------------------------------------------------------------- |
Консольный код:
Код: | //---------------------------------------------------------------------------
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
DWORD t_start, t_stop, t;
unsigned short int i, j, d;
printf ("Press any key to start ...\n");
getch ();
t_start = GetTickCount ();
d=1;
for (i=1; i<=30000; i++)
for (j=1; j<=30000; j++)
{
d=d*5;
}
t_stop = GetTickCount ();
t = t_stop - t_start;
printf ("Test1 :%d\n", t);
t_start = GetTickCount ();
for (int i=1, d=1; i<=30000; i++)
for (int j=1; j<=30000; j++, d*=5);
t_stop = GetTickCount ();
t = t_stop - t_start;
printf ("Test2 :%d\n", t);
getch ();
return 0;
}
//---------------------------------------------------------------------------
|
И наконец код для VC:
Код: | #include <windows.h>
#include <stdio.h>
#include <conio.h>
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
DWORD t_start, t_stop, t;
unsigned short int i, j, d;
printf ("Press any key to start ...\n");
getch ();
t_start = GetTickCount ();
d=1;
for (i=1; i<=30000; i++)
for (j=1; j<=30000; j++)
{
d=d*5;
}
t_stop = GetTickCount ();
t = t_stop - t_start;
printf ("Test1 :%d\n", t);
t_start = GetTickCount ();
for (int i=1, d=1; i<=30000; i++)
for (int j=1; j<=30000; j++, d*=5);
t_stop = GetTickCount ();
t = t_stop - t_start;
printf ("Test2 :%d\n", t);
LARGE_INTEGER Start,Finish;
int time1, time2;
QueryPerformanceCounter(&Start);
d=1;
for (i=1; i<=30000; i++)
for (j=1; j<=30000; j++)
{
d=d*5;
}
QueryPerformanceCounter(&Finish);
time1=(int)((LONGLONG)Finish.QuadPart-(LONGLONG)Start.QuadPart);
printf ("Test1_2: %d\n", time1);
QueryPerformanceCounter(&Start);
for (int i=1, d=1; i<=30000; i++)
for (int j=1; j<=30000; j++, d*=5);
QueryPerformanceCounter(&Finish);
time2=(int)((LONGLONG)Finish.QuadPart-(LONGLONG)Start.QuadPart);
printf ("Test2_2: %d\n", time2);
getch ();
return 0;
}
//--------------------------------------------------------------------------- |
готовые проекты можно взять тут
ftp://kamensk.donpac.ru/upload/goldsoft/SpeedTest.rar - полный (678К)
ftp://kamensk.donpac.ru/upload/goldsoft/SpeedTestLite.rar - облегченная версия , типа удалил лишние файлы (353К)
Итак теперь результаты тестов:
Delphi7
Test1: 4276
Test2: 2824
Delphi7 console:
Test1: 2764
Test2: 4176
Builder 6
Test1: 4186
Test2: 4216
Builder 6 Console
Test1: 4306
Test2: 4266
VC
Test1: 0
Test2: 0
Поскольку release версия приложения на VC показала нули я дописал еще кусочек кода, чтобы увидеть более точные значения.
код:
Код: | QueryPerformanceCounter(&Finish);
time1=(int)((LONGLONG)Finish.QuadPart-(LONGLONG)Start.QuadPart);
printf ("Test1_2: %d\n", time1);
QueryPerformanceCounter(&Start);
for (int i=1, d=1; i<=30000; i++)
for (int j=1; j<=30000; j++, d*=5);
QueryPerformanceCounter(&Finish);
time2=(int)((LONGLONG)Finish.QuadPart-(LONGLONG)Start.QuadPart);
printf ("Test2_2: %d\n", time2); |
После чего увидел результаты теста:
Test1: 9
Test2: 5
По логике вещей так и должно быть, нормальный компилятор должен
Код: | for (int i=1, d=1; i<=30000; i++)
for (int j=1; j<=30000; j++, d*=5); |
свернуть во что-то типа d = (5^30000)^30000, а потом уже транслировать ее ...
вот такие пирожки.
Кста и справки делфи
Generic integer types for 32-bit implementations of Delphi
Type Range Format
Integer -2147483648..2147483647 signed 32-bit
Cardinal 0..4294967295 unsigned 32-bit
Fundamental integer types include Shortint, Smallint, Longint, Int64, Byte, Word, and Longword.
Fundamental integer types
Type Range Format
Shortint -128..127 signed 8-bit
Smallint -32768..32767 signed 16-bit
Longint -2147483648..2147483647 signed 32-bit
Int64 -2^63..2^63-1 signed 64-bit
Byte 0..255 unsigned 8-bit
Word 0..65535 unsigned 16-bit
Longword 0..4294967295 unsigned 32-bit
а число (5^30000)^30000 больше чем 2147483647 отсюда выводы прога работает не прально.
Вообще советую прочесть http://www.rsdn.ru/article/devtools/perftest.xml там о многом сказано.
Ну и наверное не малое значение имеет тот факт, что все производители компьютерных игр делают их на сях. Так например Quake 1,2,3, Unreal. - это все таки показатель. Исходники видел сам [/code] |
|
Вернуться к началу |
|
|
Kefir
Зарегистрирован: 16.04.2005 Сообщения: 443 Откуда: Пермь
|
Добавлено: Пн Июн 06 2005 12:30 Заголовок сообщения: |
|
|
Я вообще слабо понимаю о чем вы тут говорите, но компаковский компилятор фортрана пустые циклы, ну или почти пустые оптимизирует так, что там нет цикла вообще. Вот, а что касается дельфы и билдера, то насколько я понимаю скорость должнва быть примерно одинакова. Кстати как то в PC Magazine была статья, в которой утверждалось, что компилятор билдера настолько оптимимзирован, что могут возникать ошибки в абсолютно корректном коде. Вообщем в любом случае проверять производительность на таком простом примере недостоверно, лучше сделать что-нибудь реальное, типа там преобразования фурье или вейвлет преобразование. |
|
Вернуться к началу |
|
|
LuckyELF
Зарегистрирован: 06.03.2005 Сообщения: 4 Откуда: Россия, Ростовская обл., Каменск
|
Добавлено: Пн Июн 06 2005 16:11 Заголовок сообщения: |
|
|
Kefir писал(а): | Я вообще слабо понимаю о чем вы тут говорите, но компаковский компилятор фортрана пустые циклы, ну или почти пустые оптимизирует так, что там нет цикла вообще. Вот, а что касается дельфы и билдера, то насколько я понимаю скорость должнва быть примерно одинакова. Кстати как то в PC Magazine была статья, в которой утверждалось, что компилятор билдера настолько оптимимзирован, что могут возникать ошибки в абсолютно корректном коде. Вообщем в любом случае проверять производительность на таком простом примере недостоверно, лучше сделать что-нибудь реальное, типа там преобразования фурье или вейвлет преобразование. |
Да, да, с этим я согласен, этот не тест а так смех, в статье на rsdn (ссылку см. выше) сделаны довольно нормальные тесты, правда статья старая... |
|
Вернуться к началу |
|
|
|