Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

С++Builder лействительно медленее Delphi?

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
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 приложения между этими языками?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
DmitryShm



Зарегистрирован: 17.11.2003
Сообщения: 211
Откуда: Казань

СообщениеДобавлено: Сб Июн 04 2005 13:40    Заголовок сообщения: вопрос Ответить с цитатой

Ты какие опции компилятора использовал? Вообще, фраза Delphi быстрее/медленнее С++ Builder как минимум некорректна. Все зависит от инструментов, которыми пользуешься. Delphi или С++ -- всего-лишь языковые нотации.
_________________
love IT
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
LuckyELF



Зарегистрирован: 06.03.2005
Сообщения: 4
Откуда: Россия, Ростовская обл., Каменск

СообщениеДобавлено: Сб Июн 04 2005 22:49    Заголовок сообщения: Re: вопрос Ответить с цитатой

DmitryShm писал(а):
Ты какие опции компилятора использовал? Вообще, фраза Delphi быстрее/медленнее С++ Builder как минимум некорректна. Все зависит от инструментов, которыми пользуешься. Delphi или С++ -- всего-лишь языковые нотации.


Как раз делфи это среда разработки, а С++ концептуальный язык.
Опции компилятора действительно сильно влияют на работу, тем более что по умолчанию в билдере стоит без оптимизации + дебаг версия, не считая других настроек.

Если хочешь писать 3д пиши на MS Visual Studio.net
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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 - облегченная версия Smile, типа удалил лишние файлы (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. - это все таки показатель. Исходники видел сам Smile[/code]
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Kefir



Зарегистрирован: 16.04.2005
Сообщения: 443
Откуда: Пермь

СообщениеДобавлено: Пн Июн 06 2005 12:30    Заголовок сообщения: Ответить с цитатой

Я вообще слабо понимаю о чем вы тут говорите, но компаковский компилятор фортрана пустые циклы, ну или почти пустые оптимизирует так, что там нет цикла вообще. Вот, а что касается дельфы и билдера, то насколько я понимаю скорость должнва быть примерно одинакова. Кстати как то в PC Magazine была статья, в которой утверждалось, что компилятор билдера настолько оптимимзирован, что могут возникать ошибки в абсолютно корректном коде. Вообщем в любом случае проверять производительность на таком простом примере недостоверно, лучше сделать что-нибудь реальное, типа там преобразования фурье или вейвлет преобразование.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
LuckyELF



Зарегистрирован: 06.03.2005
Сообщения: 4
Откуда: Россия, Ростовская обл., Каменск

СообщениеДобавлено: Пн Июн 06 2005 16:11    Заголовок сообщения: Ответить с цитатой

Kefir писал(а):
Я вообще слабо понимаю о чем вы тут говорите, но компаковский компилятор фортрана пустые циклы, ну или почти пустые оптимизирует так, что там нет цикла вообще. Вот, а что касается дельфы и билдера, то насколько я понимаю скорость должнва быть примерно одинакова. Кстати как то в PC Magazine была статья, в которой утверждалось, что компилятор билдера настолько оптимимзирован, что могут возникать ошибки в абсолютно корректном коде. Вообщем в любом случае проверять производительность на таком простом примере недостоверно, лучше сделать что-нибудь реальное, типа там преобразования фурье или вейвлет преобразование.


Да, да, с этим я согласен, этот не тест а так смех, в статье на rsdn (ссылку см. выше) сделаны довольно нормальные тесты, правда статья старая...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...