Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Офтопик > Мысли вслух
Перезагрузить страницу Самый крутой язык программирования
Результаты опроса: Самый крутой язык на котором Вы пишете
Assembler 3 6.38%
C 0 0%
C++ 16 34.04%
D 0 0%
Go 1 2.13%
Java 1 2.13%
C# 4 8.51%
Pascal(Modula-*/Oberon-*/Component Pascal/Delphi/Free Pascal) 0 0%
Ada 0 0%
(Visual) Basic 1 2.13%
(Visual) Prolog/Mercury 8 17.02%
Lisp 3 6.38%
ML(SML, OCaml, F#) 1 2.13%
Haskell 1 2.13%
Erlang 0 0%
Nemerle 0 0%
Scala/Kotlin 0 0%
Python 0 0%
Ruby 0 0%
Другой язык (затея этого голосования - полный бред) 8 17.02%
Голосовавшие: 47. Вы ещё не голосовали в этом опросе

Ответ
 
Опции темы Опции просмотра
  (#76 (permalink)) Старый
SH@DOW SH@DOW вне форума
Member
 
Сообщений: 2,085
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.09.2002
По умолчанию 13.12.2002, 13:10

Народ, вы тута спорите спорите, а когда же бокс будет!

Мне всеравно на чом писать лишь бы результат был!

А кто изабрел инжинер или программист какая разница, вот работаю программистом 5-й год, 1.5 года на паскале писал! НО что интересное до сихпор не знал кто его придумал! Ну и что, не умер!!

Вот не получаеться на паскале, можно на С или С++ сделать!
Нужна база данных, я лучше на Делфях или Билдере нежели на
Вижуле.

А бокс я всеравно хочу увидить! Мне нравиться кровь!!!
Ответить с цитированием
  (#77 (permalink)) Старый
S.Yu.Gubanov S.Yu.Gubanov вне форума
Member
 
Сообщений: 587
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.12.2002
По умолчанию 17.12.2002, 17:08

Цитата:
Originally posted by SH@DOW
[b]А бокс я всеравно хочу увидить! Мне нравиться кровь!!!
Сейчас будет литься кровь...

Сравним скорость работы операторов new/delete и New()/Dispose()

Delphi:

Код:
type
 PTestNode = ^TTestNode;
 TTestNode = record
   Value: integer;
   next: PTestNode;
 end;

procedure TForm1.Button1Click(Sender: TObject);
var
  max,i: integer;
  pRootNode, pn, pntmp: PTestNode;
  t: cardinal;
begin
  Button1.Enabled := False;
  max := StrToInt(Edit1.Text);
  New(pRootNode);
  pn := pRootNode;
  t := GetTickCount();
  for i:=1 to max do
    begin
      New(pn.next);
      pn := pn.next;
    end;
  t := GetTickCount() - t;
  ShowMessage(IntToStr(t));
  pn := pRootNode;
  t := GetTickCount();
  while pn.next <> nil do
    begin
      pntmp := pn;
      pn := pn.next;
      Dispose(pntmp);
    end;
  t := GetTickCount() - t;
  ShowMessage(IntToStr(t));
  Button1.Enabled := True;
end;

C++ Builder:

Код:
struct TTestNode {int Value; TTestNode* next;};

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Button1->Enabled = false;
  int max = StrToInt(Edit1->Text);
  TTestNode* pRootNode = new TTestNode;
  TTestNode* pn = pRootNode;
  int t = GetTickCount();
  for(int i=0; i<max; i++)
    {
      pn->next = new TTestNode;
      pn = pn->next;
    }
  t = GetTickCount() - t;
  ShowMessage(IntToStr(t));
  pn = pRootNode;
  TTestNode* pntmp;
  t = GetTickCount();
  while(pn->next)
    {
      pntmp = pn;
      pn = pn->next;
      delete pntmp;
    }
  t = GetTickCount() - t;
  ShowMessage(IntToStr(t));
  Button1->Enabled = true;
}
Создаем 10'000'000 элементов TTestNode в Delphi 7 и в C++ Builder 6.
Объем выделяемой памяти оказывается одинаковым. Смотрим на время.

Delphi 7:
Время создания 0.609 сек
Время удаления 1.328 сек

C++ Builder 6:
Время создания 1.719 сек
Время удаления 1.812 сек



Вывод. Функция New() из Delphi в 2.82 раза быстрее инструкции new из C++ Builder. Функция Dispose() из Delphi в 1.36 раза быстрее инструкции delete из C++ Builder.
Ответить с цитированием
  (#78 (permalink)) Старый
SH@DOW SH@DOW вне форума
Member
 
Сообщений: 2,085
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.09.2002
По умолчанию 17.12.2002, 18:09

Дай я пажму тваю мужественную руку!!
Ответить с цитированием
  (#79 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 17.12.2002, 18:43

Цитата:
Originally posted by S.Yu.Gubanov
[b]Сейчас будет литься кровь...

Вывод. Функция New() из Delphi в 2.82 раза быстрее инструкции new из C++ Builder. Функция Dispose() из Delphi в 1.36 раза быстрее инструкции delete из C++ Builder.
Хочешь крови ? Ты ее получишь...

1. Нашел с чем сравнивать, - Борландовский Delphi с их же Билдером... Да, в Delphi механизм динамического выделения памяти оптимизирован неплохо, надо отдать должное разработчикам Delphi. Но ведь программа не состоит из одних только операторов new/delete. А вот как насчет более приближенного к реальным условиям теста?

Dhrystone Benchmark, Version 2.1 (Language: C)
Dhrystone Benchmark, Version 2.1 (Language: Pascal)

Intel C/C++ 4.5, Win32 console application
Microseconds for one run through Dhrystone: 0.956
Dhrystones per Second: 1046025

MSVC++ 6.0, Win32 console application
Microseconds for one run through Dhrystone: 1.241
Dhrystones per Second: 805801

Borland Delphi 6, Win32 console application
Microseconds for one run through Dhrystone: 1.266
Dhrystones per Second: 789889

GCC 2.95.2, DOS PM32 console application
Microseconds for one run through Dhrystone: 1.137
Dhrystones per Second: 879227

Borland C++ Builder 5, Win32 console application
Microseconds for one run through Dhrystone: 1.651
Dhrystones per Second: 605656

Все замеры проводились на одной машине (год назад), приведеннные цифры - среднее из пяти прогонов. Как видишь, Борландовский Билдер здесь аутсайдер. А Дельфи хоть и выглядит неплохо, но Интеловскиму компилятору C++ проиграл более 30%... Так что, конечно, можно сравнить Дельфи с явным аутсайдером гонки, но много ли от такого сравнения проку ?

Если приведенных аргументов недостаточно, можно посмотреть цикл статей "Кто сегодня самый шустрый" на RSDN.

2. В приведенном тобой коде есть две ошибки, которые могли повлиять (а могли не повлиять) на результат эксперимента. По крайней мере, тестовый код на C у меня "завис", пришлось снять задачу. Результат, полученный в п.3 - после исправления.

3. Запрашиваемый в цикле объем памяти (80 Мбайт) довольно значительный, поэтому необходимо учитывать, что реальные затраты на new/delete могут быть замаскированы затратами на свопинг в/из файла подкачки. По крайней мере, на моей старенькой домашней машине (192 Мб ОЗУ) при 10 миллионах итераций диск сразу же "зажужжал", и полученные цифры ни в какие ворота не лезут, -
например, паскалевский new выполнялся от 3800 до 20000 тиков, а сишный new - от 8600 до 18000 тиков. При таком разбросе нельзя говорить об объективности полученного результата. А на рабочей машине (512 Мб) свопа нет, и результаты вполне пристойные, - как и на миллионе итераций, так и на 10 миллионах, результаты пропорциональны. Кстати, D6 и BCB5 при отсутствии свопа не отличаются, - сумма времени new+delete 1322 тика для D6, 1312 для BCB5, разница в 1% - в пределах точности эксперимента
Ответить с цитированием
  (#80 (permalink)) Старый
SH@DOW SH@DOW вне форума
Member
 
Сообщений: 2,085
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.09.2002
По умолчанию 17.12.2002, 19:17

Ну 30% это не так и много, а Билдер загнулся!
Ответить с цитированием
Ads.
  (#81 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 18.12.2002, 12:42

Разница в 30% - немного ? Не согласен. Не будет ли любезен благородный дон отдать мне 30% (одну треть!) своей зарплаты, - ведь это совсем немного, разницы благородный дон не заметит ?
Ответить с цитированием
  (#82 (permalink)) Старый
SH@DOW SH@DOW вне форума
Member
 
Сообщений: 2,085
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.09.2002
По умолчанию 18.12.2002, 12:56

Ну если зарплата блогородного дона будет оцениваться в такой же размерности как и выше указанное время, типа
Цитата:
1 секунда -- 1 рубль
То 30% от ентого рубля с копейками так уж и быть благородный дон отдаст!
Ответить с цитированием
  (#83 (permalink)) Старый
S.Yu.Gubanov S.Yu.Gubanov вне форума
Member
 
Сообщений: 587
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.12.2002
По умолчанию 20.12.2002, 15:57

Цитата:
Originally posted by Влад
[b]1. Нашел с чем сравнивать, - Борландовский Delphi с их же Билдером... Да, в Delphi механизм динамического выделения памяти оптимизирован неплохо, надо отдать должное разработчикам Delphi...
Думаю, что дело не в этом.


Для тех кто не "въехал" в то почему дельфийская функция New() для record-ов работает в два с половиной раза быстрее С++ билдеровской инструкции new для struct-ов я попробую объяснить подробно. Возможно, объясню не правильно, тогда пусть меня поправят кто это понимает лучше. Версию о том, что билдер писали люди с кривыми руками - вот и торможение, думаю, всерьез, воспринимать не стоит, а надо попытаться найти логическое объяснение. Как мне кажется, дело в том, что в языке С++ тип struct считается классом, просто у него все члены public, а в языке pascal тип record это просто обычная переменная - запись в пямяти. Паскалевский тип record эквивалентен Си-шному struct, но не эквивалентен Си++шному struct. Когда в паскале вызывается New(p); то это просто выделяется кусочек памяти соответствующего размера под новую переменную и выдается указатель на него, а в С++ инструкция p = new ... вызывает конструктор класса-структуры, со всеми вытекающими последствиями торможения. Создавать экземпляр объекта дольше чем создавать обычную переменную. Понятно? Теперь ложка меда для С++шников и ложка дегтя для дельфинистов. Так как struct и class в С++ это одно и тоже, то инструкция new для структур и для классов должна работать в точности с одинаковой скоростью и выделять в точности одинаковое количество памяти и для struct и для
аналогичного class. Я это проверил для случаев
Код:
struct 
  TTestNode {
   int Value; 
   TTestNode* next;
};
class TTestClassNode {
  public:
    int Value;
    TTestClassNode* next;
};
Создание и удаление
Код:
TTestNode* p_struct = new TTestNode;
  TTestClassNode* p_class = new TTestClassNode;
происходит с одинаковой скоростью и памяти расходуется одинаковое количество и для struct и для class. В Delphi, class - это нечто большее чем record с функциями. Все классы, по умолчанию, являются потомками самого главного класса TObject.
Код:
type
  TFoo = class(TObject)
  end;

var
  Foo: TFoo;
У TObject есть несколько полезных функций, которые наследует каждый класс Delphi. Всвязи с этим, любой "голый" класс Delphi, на самом деле, не является истинно "голым" и занимает некоторые ресурсы. Вызовы
Код:
Foo := TFoo.Create();
Foo.Free;
занимают чуть большее время, чем это могло бы быть, будь класс истинно "голым" и памяти такой класс берет чуть больше..., поэтому следует ожидать, что создание/удаление дельфийского класса будет медленнее чем С++шного. Я измерил скорости выполнения и объем памяти следующих кодов

C++ Builder 6
Код:
class TTestClassNode {
  private:
    int Value;
  public:
    TTestClassNode* next;
};

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  Button2->Enabled = false;
  int max = StrToInt(Edit1->Text);
  TTestClassNode* pRootNode = new TTestClassNode;
  TTestClassNode* p = pRootNode;
  int t = GetTickCount();
  for(int i=0; i<max; i++)
    {
      p->next = new TTestClassNode;
      p = p->next;
    }
  t = GetTickCount() - t;
  ShowMessage(IntToStr(t));

  p = pRootNode;
  TTestClassNode* p_tmp;
  t = GetTickCount();
  while(p->next)
    {
      p_tmp = p;
      p = p->next;
      delete p_tmp;
    }
  t = GetTickCount() - t;
  ShowMessage(IntToStr(t));
  Button2->Enabled = true;
}
Delphi 7

Код:
type
 TTestClassNode = class
   private
     Value: integer;
   public
     Next: TTestClassNode;
 end;

procedure TForm1.Button2Click(Sender: TObject);
var
  max,i: integer;
  RootNode, p, p_tmp: TTestClassNode;
  t: cardinal;
begin
  Button2.Enabled := False;
  max := StrToInt(Edit1.Text);
  RootNode := TTestClassNode.Create;
  p := RootNode;
  t := GetTickCount();
  for i:=1 to max do
    begin
      p.Next := TTestClassNode.Create;
      p := p.Next;
    end;
  t := GetTickCount() - t;
  ShowMessage(IntToStr(t));
  p := RootNode;
  t := GetTickCount();
  while p.Next <> nil do
    begin
      p_tmp := p;
      p := p.Next;
      p_tmp.Free;
    end;
  t := GetTickCount() - t;
  ShowMessage(IntToStr(t));
  Button2.Enabled := True;
end;
На моем компьютере (Pentium 4 1800Mhz 512Kb, 256MB DDR266, Windows2000 SP2), (после того как я отключил все сервисы, которые смог отключить и снял все программы, которые виндос мне дала снять) получилось

max = 10'000'000;

Delphi 7 record
New(); 0.593 сек
Dispose(); 1.141 сек

C++ Builder 6 struct == class
new 1.500 сек
delete 1.734 сек

Delphi 7 Class
Create(); 1.797 сек
Free(); 1.954 сек

Память (если верить показаниям Task Manager)
Delphi 7 record и C++ Builder 6 struct == class отъели по 117Mb, в то время как
Delphi 7 Class отъел 157Mb (на 40 Mb больше, т.е. каждый объект дельфи получился на 4 байта больше чем record). Значит, хотя С++шный struct = class проигрывает дельфийскому record в 2.53 раза, но зато он отыгрывается на дельфийском TObject обгоняя его в этом тесте на 20% (и дельфийский класс занял в этом тесте на 34% памяти больше).


Вывод.
Компилятор С++ Builder 6 работает с типом struct так же как и с class, а мог бы работать существенно (как минимум в 2.53 раза) быстрее. Если кого-нибудь это заинтересовало, то проверьте свой компилятор.

P.S.
Кстати, сейчас попробовал для создания структуры вместо С++шной new/delete использовать чисто Сишную malloc()/free(). Время создания уменьшилось с 1.5 сек до 1.23 сек. Время убивания осталось прежним 1.73 сек...
Ответить с цитированием
  (#84 (permalink)) Старый
SH@DOW SH@DOW вне форума
Member
 
Сообщений: 2,085
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.09.2002
По умолчанию 20.12.2002, 16:16

У меня особого выбора нету между БИЛДЕРОМ и ДЕЛФОЙ!
Меня в полне устраивает Делфа, поентому резона нету!
Ответить с цитированием
Ads
  (#85 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 20.12.2002, 20:24

Цитата:
Originally posted by S.Yu.Gubanov+-->
Цитата:
Возможно, объясню не правильно, тогда пусть меня поправят кто это понимает лучше. [skip...]
Паскалевский тип record эквивалентен Си-шному struct, но не эквивалентен Си++шному struct. Когда в паскале вызывается New(p); то это просто выделяется кусочек памяти соответствующего размера под новую переменную и выдается указатель на него, а в С++ инструкция p = new ... вызывает конструктор класса-структуры, со всеми вытекающими последствиями торможения. Создавать экземпляр объекта дольше чем создавать обычную переменную. Понятно?
Понятно, однако ты добросовестно заблуждаешься.
Все твои рассуждения верны, и при динамическом создании экземпляра C++-класса (независимо от атрибутов видимости) вызывается его конструктор, а при уничтожении - деструктор. Но - если ты не определил самостоятельно конструктор и деструктор класса (неважно, struct или class), то компилятор автоматически предоставляет их версии по умолчанию, которые ничего не делают ( {} ). Разработчики компиляторов такие пустые конструкторы и деструкторы безжалостно вырезают, и в результате машинный код не содержит лишних вызовов (можешь перейти в окно дизассемблера и проверить). А вот если определить свой конструктор - то сразу после operator new будет вызываться соответствующий конструктор. Это также четко видно в дизассемблере.
Таким образом, при отсутствии определенных тобой конструкторов и деструкторов паскалевский record, Сишный struct и плюсовой struct (и даже плюсовой class!) эквивалентны.

<!--QuoteBegin-S.Yu.Gubanov

[b]Компилятор С++ Builder 6 работает с типом struct так же как и с class, а мог бы работать существенно (как минимум в 2.53 раза) быстрее.
Правильно, Билдер (и любой плюсовой компилятор) работает с struct точно так же, как с class. В C++ struct отличается от class только атрибутами видимости членов.
И еще: по твоим цифрам получается, что не в 2.53 раза, а всего примерно в 1.6 раза - IMHO правильнее будет учитывать сумму new+delete (или же ты предлагаешь в реальных приложениях, выделив память, никогда ее не освобождать? Нет ведь, правда?). Но и это очень большой разрыв в производительности!

Кстати, тормознутость Билдера я не оспариваю, мой тезис в другом - если уж мы начинаем сравнивать скорость исполнения генерируемого компиляторами кода, то компилятор Delphi (а это, безусловно, лучший паскалевский компилятор!) правильнее было бы сравнивать также с лучшим Сишным компилятором. Разве не так?
Ответить с цитированием
  (#86 (permalink)) Старый
SH@DOW SH@DOW вне форума
Member
 
Сообщений: 2,085
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.09.2002
По умолчанию 23.12.2002, 11:32

Не нащот сравнения, надо спавнивать компиляторы лучшие в своем классе!
Ответить с цитированием
  (#87 (permalink)) Старый
Olesya Olesya вне форума
Member
 
Сообщений: 1,485
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 11.06.2002
По умолчанию 24.12.2002, 16:37

Всё дело в том что выбор среди паскалевских компиляторов не очень то, а сишных куда больше.
От и берёт mr. S.Yu.Gubanov самый тормозной C++Builder, об тормознутоски которого спорить не собираюсь и равняет. Ты аналогичный пример сделай наприер на Visual C++, тогда можно будет посмотреть....
Ответить с цитированием
  (#88 (permalink)) Старый
S.Yu.Gubanov S.Yu.Gubanov вне форума
Member
 
Сообщений: 587
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.12.2002
По умолчанию 24.12.2002, 18:34

Цитата:
Originally posted by Olesya
[b]...Ты аналогичный пример сделай наприер на Visual C++, тогда можно будет посмотреть....
Вот, получу зарплату куплю Visual Studio 7 (пиратскую разумеется)...
Ответить с цитированием
  (#89 (permalink)) Старый
SH@DOW SH@DOW вне форума
Member
 
Сообщений: 2,085
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.09.2002
По умолчанию 24.12.2002, 19:48

А я зарплату на водку пущу. Ща праздники намечаються!
Ответить с цитированием
  (#90 (permalink)) Старый
Garik Garik вне форума
Member
 
Сообщений: 6,201
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 07.06.2002
По умолчанию 25.12.2002, 01:40

Цитата:
Originally posted by S.Yu.Gubanov
[b]Вот, получу зарплату куплю Visual Studio 7 (пиратскую разумеется)...
Уважаемый! Если вы Страуструпа хотя бы до половины не дочитаете (и не разберетесь), то вам что 4й, что 6й, что 7й Вижуал Студио - все едино! Надо сам язык осваивать!
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Исследуем язык программирования Mercury xonix Prolog 103 06.06.2018 21:26
Какой самый легкий язык программирования для изучения? imported_Pirat Вопросы начинающих программистов 9 20.09.2011 10:19
Язык программирования Gwai Prolog 8 17.05.2011 13:42
Самый крутой язык: исходники Arachnelis Мысли вслух 10 14.10.2010 12:03
Самый крутой Пролог Винитарх Prolog 256 03.10.2010 07:12
Разрабатываю язык логического программирования. prokopiy Prolog 71 11.08.2010 22:05
Язык программирования Barsic Blan Форум программистов 1 22.03.2008 10:26
язык программирования Матрикс Форум программистов 1 07.06.2007 19:16
Скрипт или язык программирования GEV_256 Мысли вслух 24 09.01.2006 01:54
Язык программирования Loid Мысли вслух 17 29.05.2005 23:20
Скриптовый язык vs Язык программирования relonar Мысли вслух 4 24.09.2004 02:14
Какой язык программирования выбрать Anonymous Вопросы начинающих программистов 15 29.06.2004 09:31



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов