Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Флейм > Какой язык больше похож на Delphi?


Автор: LamerTM 31.7.2009, 14:57
Вопрос: 

Какой язык больше всего похож на Delphi, но при этом имеет возможность определять типы в модуле в произвольном порядке (типы, ссылающиеся друг на друга), возможность определять в разных модулях классы и типы ссылающиеся друг на друга. Делать все это совершенно произвольно, без ограничений на порядок объявлений.


При этом  нужно чтобы были конкретные от Delphi свойства:

- Визуальное программирование под винду. Чтобы можно было бросить готовую кнопку (listbox, combobox, memo, etc) на форму и писать обработчики.
- ООП со всеми примочками (виртуальные функции, наследование и т.п.). Желательно: чтобы были свойства (properties), но это не критично.
- Компилированная программа должна работать очень быстро. Т.е. язык не должен быть интерпретируемым.
- Ну и вообще как можно больше похожестей на Delphi. Идеал - Delphi с возможностью определять ссылающиеся друг на друга типы в разных модулях. Но я так понимаю, что такого делфи нет.

Спрашиваю потому что пишу на Delphi и столкнулся с тем, что нельзя объявить ссылающиеся друг на друга классы в разных модулях. В связи с этим появилась мысль перейти на другой язык, без подобных ограничений. Ну и конечно если кто-то скажет как это сделать в Delphi, то это будет просто замечательно. smile 

Автор: ТоляМБА 31.7.2009, 15:12
Цитата(LamerTM @  31.7.2009,  17:57 Найти цитируемый пост)
Какой язык больше всего похож на Delphi

Английский!

Автор: Alexeis 31.7.2009, 17:05
  Вопрос похож на - "Миня вчера прижало дверьми автобуса, посоветуйте автобус без дверей" smile .

Автор: LamerTM 31.7.2009, 17:29
Цитата(Alexeis @ 31.7.2009,  17:05)
Вопрос похож на - "Миня вчера прижало дверьми автобуса, посоветуйте автобус без дверей" smile .

Абсолютно верно. Именно в этом вопрос и состоит. Я не мазохист и наслаждений от прижатия дверями не испытываю.

Автор: Alexeis 31.7.2009, 17:36
Цитата(LamerTM @  31.7.2009,  16:29 Найти цитируемый пост)
Именно в этом вопрос и состоит. Я не мазохист и наслаждений от прижатия дверями не испытываю. 

  Однако ж куча народу каждый день ездит на автобусах  smile . Не лучше ли решить свою маленькую проблему, чем большую глобальную?

Автор: LamerTM 31.7.2009, 17:52
Цитата(Alexeis @ 31.7.2009,  17:36)
Цитата(LamerTM @  31.7.2009,  16:29 Найти цитируемый пост)
Именно в этом вопрос и состоит. Я не мазохист и наслаждений от прижатия дверями не испытываю. 

  Однако ж куча народу каждый день ездит на автобусах  smile . Не лучше ли решить свою маленькую проблему, чем большую глобальную?

Мнение кучи людей для меня не является критерием истины.
Именно свою маленькую проблему я и хочу решить. Глобальные меня не волнуют. Я же не собираюсь заставлять всех ездить в автобусах без дверей.

Автор: Lazin 31.7.2009, 17:55
Delphi это lol smile

Автор: LamerTM 31.7.2009, 18:01
Цитата(Lazin @ 31.7.2009,  17:55)
Delphi это lol smile

Вам смешно, а у меня развитие программы остановилось. Как бы не до смеха smile . Умные делфисты предлагают "продумать структуру". В переводе на русский: свалить весь код в один модуль.

Сейчас тестанул C#. Можно классы в разных модулях объявить, как мне нужно. Но... время работы компилированного кода в 2 раза ниже, чем в Delphi (простой цикл выполняется в 2 раза дольше). Жесть.

Автор: wester 31.7.2009, 19:25
LamerTM, 
давно пришел к утверждению что скорость работы программы зависит от кривизны рук кодера вне зависимости от среды... 

а чем С_два_креста не по нраву ? 


PS дельфи это и правда lol smile

Автор: Alexeis 31.7.2009, 19:43
Lazin, в С++ заголовки могут ссылаться друг на друга циклически?

Автор: LamerTM 31.7.2009, 20:02
Цитата(wester @ 31.7.2009,  19:25)
LamerTM, 
давно пришел к утверждению что скорость работы программы зависит от кривизны рук кодера вне зависимости от среды... 

а чем С_два_креста не по нраву ? 


PS дельфи это и правда lol smile

Написал код в C#:


Код

        private void button1_Click(object sender, System.EventArgs e)
        {
            DateTime dd=DateTime.Now;
            int i;
            int k=0;
            for(i=0;i<1000000000;i++) k=k+1;
            TimeSpan f=DateTime.Now-dd;


            button1.Text=f.ToString();
            Text =k.ToString();
        }


Я допускаю что руки кривые. Это мой первый код на С# в моей жизни.


И такой же на делфи:

Код

procedure TForm1.Button1Click(Sender: TObject);
var       i, k: Integer;
          dt: TDateTime;
begin
          dt := Now;
          k := 0;
          for i := 0 to 1000000000 do k := k + 1;
          Caption := IntToStr(k);
          Button1.Caption := IntToStr(MilliSecondsBetween(Now, dt));
end;


Время выполнения последнего в 2 раза меньше.

Как написать код (прямыми руками) на C#, чтобы он работал хотя бы сопоставимое время?





PS.
Извиняюсь, вы имели ввиду C++ ? 
Просто у меня его нет. И никогда не было. Изучал в универе, но то было так... называлось Borland C++. Короче, как Borland Pascal. Ни окон тебе, ни кнопочек, ни прочей лабуды.
На C++ можно писать приложения как на делфях? Есть какая-нибудь версия C++, чтобы так же просто, без заморочек на интерфейс, писать программы? Ну как Делфи, только вместо паскаля чтобы был С++ (и классы в разных модулях ссылающиеся друг на друга smile  smile  smile )?

Автор: mr.Anderson 31.7.2009, 20:17
Насчет ссылок в классах не знаю, не занимался этим на плюсах, а вообще C++ Builder.

Автор: diadiavova 31.7.2009, 20:21
LamerTM, В шарпе(точнее в дотнете) вызов метода ToString у структур связан с достаточно затратной операцией боксинга, не думаю, что в дельфях есть что-то подобное. А если так, то эти коды нельзя считать эквивалентными. Попробуй в цикле просто выполнить какую-нибудь матеметическую операцию и присвоить её результат какой-нибудь переменной.

Автор: Cheloveck 31.7.2009, 20:23
LamerTM, с такими запросами на C++ лучше не обращать внимание. Я бы посоветовал Visual Basic.Net smile

Автор: LamerTM 31.7.2009, 20:37
Цитата(diadiavova @ 31.7.2009,  20:21)
LamerTM, В шарпе(точнее в дотнете) вызов метода ToString у структур связан с достаточно затратной операцией боксинга, не думаю, что в дельфях есть что-то подобное. А если так, то эти коды нельзя считать эквивалентными. Попробуй в цикле просто выполнить какую-нибудь матеметическую операцию и присвоить её результат какой-нибудь переменной.

Я неправильно понимаю код? Интересно.

Основное время выполняется строка: for(i=0;i<1000000000;i++) {k=k+1;}.

Если ее закомментить, то время выполнения падает до нуля. Остальные процедуры (ToString, Now, MilliSecondsBetween) выполняются один раз и на результат не влияют (что подтверждается падением времени вычислений до нуля если кроме них ничего нет). Или в С# в цикле неявно вызывается ToString smile ?

Автор: diadiavova 31.7.2009, 20:38
Цитата(LamerTM @  31.7.2009,  21:37 Найти цитируемый пост)
Я неправильно понимаю код?

Извиняюсь, это я невнимательно прочитал. smile 

Автор: wester 31.7.2009, 20:44
Код

private void button1_Click(object sender, System.EventArgs e)
        {
            DateTime dd=DateTime.Now;
            int i; // можно иннициализировать в цикле (int i = 0;....)
            int k=0; 
            for(i=0;i<1000000000;i++) k=k+1; 
            TimeSpan f=DateTime.Now-dd; // зачем плодить обьекты в куче ?
            button1.Text=f.ToString();  // ужас какая затратная операция , потому что каждый раз она преобразует pbject в тип int
            Text =k.ToString(); // и нельзя это как нибудь сократить 
        }

ну а так в принципе замечаний по коду нет  smile 

Автор: LamerTM 31.7.2009, 20:49
Цитата(mr.Anderson @ 31.7.2009,  20:17)
а вообще C++ Builder.

Еще слышал про Microsoft Visual C++ (вроде так). Это не то? Там какая-то принципиальная разница есть?

Автор: mr.Anderson 31.7.2009, 22:32
LamerTM, это совершенно разные вещи. Builder - клон Delphi, с дополнительными багами и другим языком как основой. MS VC++ - вообще другая вещь, я ее видел вплоть до 6-й версии - это бред, никаких визуальных редакторов, разработка в целом чистым WinAPI и MFC, что бред. И она сейчас трансформировалась в MS VS, насколько я в курсе, в которой на C# в том числе пишут. А если хочешь клон Delphi - это C++ Builder. Он, начиная с 2007, идет в комплекте с дельфой (RAD Studio 2007+).

Автор: Cheloveck 31.7.2009, 23:48
Цитата(mr.Anderson @  31.7.2009,  23:32 Найти цитируемый пост)
Builder - клон Delphi, с дополнительными багами

+1

Цитата(mr.Anderson @  31.7.2009,  23:32 Найти цитируемый пост)
MS VC++ - вообще другая вещь, я ее видел вплоть до 6-й версии - это бред, никаких визуальных редакторов, разработка в целом чистым WinAPI и MFC, что бред.

Эмм... вообще-то в студии есть редактор диалгов визуальный. Можно интегрировать Qt вместе с его редактором форм. MFC и WinAPI далеко не обязательно, я в последнее время пишу на STL + boost, и только графику на чём-то другом.

Но повторюсь, C++ - очень сложный язык, он только на первый взгляд белый и пушистый...

Автор: Alexeis 1.8.2009, 10:23
  Ребята ну глупость же менять язык только потому что невозможны циклические ссылки в заголовках.

Автор: wester 1.8.2009, 10:37
LamerTM, 
потестил код , а разве две секунды это много ?


Автор: LamerTM 1.8.2009, 12:12
Цитата(Alexeis @ 1.8.2009,  10:23)
Ребята ну глупость же менять язык только потому что невозможны циклические ссылки в заголовках.

А как иначе решить проблему? Или ради сохранения верности языку можно забыть что он предназначен для решения практических задач? То есть вообще перестать развивать программу (потому что это сейчас мне представляется невозможным) и смотреть на заставку Делфи испытывая священный трепет? Я и сам не хочу, я привык к делфям, я их любил. Я пишу на них 6 лет, и ни чем другом таикх больших программ никогда не писал. Но для меня важна цель. Если язык не позволяет ее достичь, то такой язык мне не нужен. Ограничение является искусственным. Оно ненормально. Оно мазохисткое. Сродни приковыванию себя наручниками к постели.

Я там конечно посмотрю что еще можно сделать. Конечно в крайнем случае я всю программу забью в один модуль на несколько МБ кода. Но это будет последнее что я сделаю на этом языке. Если конечно не обнаружу ошибку в своих логических рассуждениях.

Добавлено @ 12:18
Цитата(wester @ 1.8.2009,  10:37)
LamerTM, 
потестил код , а разве две секунды это много ?

Не 2 секунды, а в 2 раза медленее. 10-30% я еще могу простить. 100% - однозначно язык фтопку. Я лучше все буду писать в одном модуле на делфях, чем удобно но тормозно на C#. Такие вот у меня приоритеты. Скорость для меня очень важна. Я очень много вычисляю, вычисления длятся иногда часами. На C# вместо 30 минут код будет выполняться час.

Автор: mr.Anderson 1.8.2009, 14:27
LamerTM, почитай в сторону unsafe-кода на C#.

Автор: Alexeis 1.8.2009, 16:47
Цитата(LamerTM @  1.8.2009,  11:12 Найти цитируемый пост)
Я там конечно посмотрю что еще можно сделать. Конечно в крайнем случае я всю программу забью в один модуль на несколько МБ кода. Но это будет последнее что я сделаю на этом языке. Если конечно не обнаружу ошибку в своих логических рассуждениях.

  Да ну зачем? Делается абстрактный класс или интерфейс в общем модуле, потом от него наследуются либо как от главного либо как от второго предка. Это мощный механизм инкапсуляции позволяющий строить максимально гибкие приложения. Посмотри на структуру VCL куча модулей с продуманной структурой и ни где нет необходимости циклического включения. Наоборот даже много классов прячется в Imlementation чтобы сокрыть детали реализации и оставить максимально простой интерфейс.

Автор: Alkash 1.8.2009, 22:45
Погляди в сторону Delphi Prism.

Автор: unicuum 1.8.2009, 23:21
Цитата(LamerTM @  31.7.2009,  14:57 Найти цитируемый пост)
Какой язык больше всего похож на Delphi

Brainfuck smile

Автор: diadiavova 2.8.2009, 07:38
Цитата(LamerTM @  1.8.2009,  13:12 Найти цитируемый пост)
Не 2 секунды, а в 2 раза медленее. 10-30% я еще могу простить. 100% - однозначно язык фтопку. Я лучше все буду писать в одном модуле на делфях, чем удобно но тормозно на C#. Такие вот у меня приоритеты. Скорость для меня очень важна. Я очень много вычисляю, вычисления длятся иногда часами. На C# вместо 30 минут код будет выполняться час.

Честно говоря озадачил ты меня своими тестами так, что я сам засел за тестирование. Дельфей у меня нет поэтому написал на C++.
Создал 2 консольных приложения на С++ под Win32 и на шарпе. Сначала результаты были какими-то странными. Ощущение было такое, что на плюсах операции выполняются мгновенно а на шарпе тормозят так, что дождаться результатов просто невозможно. Дело дошло до того, что я написал на плюсах.
Код

void test1()
{
    double l = 0;
    for(int i = 0; i < 1000000000; i++)
    {
        for(int j = 0; j < 1000000000; j++)
        {
            for(int k = 0; k < 1000000000; k++)
            {
                l++;
            }
            l = 0;
        }
    }
    cout<<l;
}

и время выполнения было равно нулю. Понятно, что это "дело рук" компилятора, который просто оптимизировал код.

Второй тест 

Код

void test2()
{
    double l = 0;
    for(int i = 1; i <= 10; i++)
    {
        for(int j = 0; j < 1000000000; j++)
        {
                l++;
        }
        l = l / i;
    }
    cout<<l;
}


показал что-то около 18 секунд, в то время, как на шарпе его аналог выполнялся около 56 секунд ( в три раза дольше).

А вот третий тест
Код

void test3()
{
    double k = 0;
    for(double i = 0; i < 100000000; i++)
    {
        k = k + sin(i);
    }
    cout << k;
}


на шарпе выполнился даже быстрее чем на плюсах. При этом надо заметить, что третий тест(в отличии от первых двух) оптимизировать вообще невозможно, придётся выполнять.

Так что с выводами ты возможно поспешил smile Хотя для того, чтобы судить о чём-то моих тестов тоже недостаточно.

ЗЫ
Плюсов не знаю, возможно что-то и намудрил. Поэтому прилагаю код.


Код

// SpeedTest.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <iostream>
#include <time.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/timeb.h>
#include <string.h>
#include <math.h>
using namespace std;
void test1()
{
    double l = 0;
    for(int i = 0; i < 1000000000; i++)
    {
        for(int j = 0; j < 1000000000; j++)
        {
            for(int k = 0; k < 1000000000; k++)
            {
                l++;
            }
            l = 0;
        }
    }
    cout<<l;
}

void test2()
{
    double l = 0;
    for(int i = 1; i <= 10; i++)
    {
        for(int j = 0; j < 1000000000; j++)
        {
                l++;
        }
        l = l / i;
    }
    cout<<l;
}


void test3()
{
    double k = 0;
    for(double i = 0; i < 100000000; i++)
    {
        k = k + sin(i);
    }
    cout << k;
}
int _tmain(int argc, _TCHAR* argv[])
{
    int x;
    int k = 0;
    cout << "Win32 speed test \n\r";
    clock_t startTime,endTime;
    startTime = clock();
    //test1();
    //test2();
    test3();
    endTime = clock();
    printf_s("\n\r Used time :    %2.3f seconds\n\r",(double)(endTime - startTime)/CLOCKS_PER_SEC);
    cout<<k;
    cin >> x;
    return 0;
}



Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SpeedTestCLR
{
    class Program
    {
        static int test2()
        {
            double l = 0;
            for (int i = 1; i <= 10; i++)
            {
                for (int j = 0; j < 1000000000; j++)
                {
                    l++;
                }
                l = l / i;
            }
            return 0;
        }

        static void test3()
        {
            double k = 0;
            for (double i = 0; i < 100000000; i++)
            {
                k = k + Math.Sin(i);
            }
        }

        static void Main(string[] args)
        {
            double k = 0;
            Console.WriteLine("CLR speed test");
            var sw = System.Diagnostics.Stopwatch.StartNew();
            //test2();
            test3();
            Console.WriteLine("Used time :    {0} seconds", (double)sw.ElapsedMilliseconds/1000);
            Console.WriteLine(k);
            Console.ReadKey();
        }
    }
}

Автор: Lazin 2.8.2009, 08:21
тема - lol smile

Автор: LamerTM 2.8.2009, 15:43
Цитата(Alexeis @ 1.8.2009,  16:47)
  Да ну зачем? Делается абстрактный класс или интерфейс в общем модуле, потом от него наследуются либо как от главного либо как от второго предка. Это мощный механизм инкапсуляции позволяющий строить максимально гибкие приложения. Посмотри на структуру VCL куча модулей с продуманной структурой и ни где нет необходимости циклического включения. Наоборот даже много классов прячется в Imlementation чтобы сокрыть детали реализации и оставить максимально простой интерфейс.

Не понял о чем это, но похоже это какое-то извращение. Мне надо было вставить одну ссылку. А тут столько писать. Да еще модули дополнительные. Вот в упор не понимаю зачем они. С точки зрения здравого смысла не понимаю. Хотя с точки зрения компилятора делфи они может быть и необходимы.

"Абстрактный класс", "наследуются", "от предка", хм... так все же классы потомки TObject. Ну я тормоз. Можно определить поле как TObject. А потом обращаться к нему через as. Будет как через ass, но на первое время сойдет. Геморно конечно и неудобно, и даже слегка извращенно, но по крайней мере новых модулей делать не надо и код в кашу смешивать тоже.




diadiavova

Функция Sin сложная и скорее всего написана в обоих языках на асме. Отсюда другие резалты. В том коде что ты привел, бОльшую часть времени будет выполняться функция sin, то есть команды асма (или как она там реализована), а не команды тестируемого языка. Если функция синуса написана на чистом C#, то я сильно удивлюсь.

Автор: diadiavova 2.8.2009, 16:04
Цитата(LamerTM @  2.8.2009,  16:43 Найти цитируемый пост)
Функция Sin сложная и скорее всего написана в обоих языках на асме.

И что с того? На шарпе в релизе этот тест на моём компе показал 223 миллисекунды, а на плюсах - 7,5 ... СЕКУНД (примерно в 35 раз медленнее).
В конечном итоге какая разница что и как реализовано? Если ты пишешь на языке, то используешь те возможности, которые он предоставляет. Тебе нужны вычисления? Пожалуйста - дотнет выполняет их довольно быстро. В каких-то других ситуациях может и тормозит, но зато там масса других вкусностей присутствует, а даром ничего не даётся - за удобство разработки чем-то жертвовать приходится.

Автор: LamerTM 2.8.2009, 16:55
Цитата(diadiavova @ 2.8.2009,  16:04)
И что с того? На шарпе в релизе этот тест на моём компе показал 223 миллисекунды, а на плюсах - 7,5 ... СЕКУНД (примерно в 35 раз медленнее).
В конечном итоге какая разница что и как реализовано? Если ты пишешь на языке, то используешь те возможности, которые он предоставляет. Тебе нужны вычисления? Пожалуйста - дотнет выполняет их довольно быстро. В каких-то других ситуациях может и тормозит, но зато там масса других вкусностей присутствует, а даром ничего не даётся - за удобство разработки чем-то жертвовать приходится.

Когда нужны функции библиотек языка - это одно. Когда нужен быстрый язык для реализации своих функций - это другое. Я не использую синусы. Я использую только примитивные операции (+-*/) с типами int и double, максимум Round, Trunc и Power.



Купил сегодня Borland Developer Studio 2006. За 200 рублей. Надеюсь оно того стоит. smile 



Цикл на C# [ for(i=0;i<1000000000;i++) k=k+1; ] компилится в это:

inc dword ptr [ebp-0x18]
inc dword ptr [ebp-0x14]
cmp [ebp-0x14],0x3b9aca00
jl 0x.....




Цикл на Delphi7 [for i := 0 to 1000000000 do k := k + 1;] компилится в это:

inc ebx
dec eax
jnz $-04

(Аж слезы навернулись smile )



Цикл на Delphi 2006 :

inc ebx
dec eax
jnz $-04

(то же что Delphi7  smile  smile )



C++Builder (BDS2006)

inc dword ptr [ebp-$38]
inc dword ptr [ebp-$34]
cmp [ebp-$34],$3b9aca00
jl $00401bf9

 smile 



Все это как бы неиллюзорно намекает, что Delphi рвет всех на части. По крайней мере на этом простом цикле. При этом C++Builder каким-то чудесным образом генерит код аналогичный C#, как по самому коду, так и по тормознутости.
200 рублей на ветер. Ну хоть делфю апргейднул, а то была Delphi7.

Цикл и инкремент это еще не все операторы, однако тендеция налицо.
Что-то похоже моя идея найти более крутой язык слегка обламывается. 

Автор: wester 2.8.2009, 17:04
LamerTM, 
ну и на чем остановились ?))


PS по одному циклу полагать что он обходит C++ с дотнетом как минимум странно
а вообще пишите на асме если так важна скорость , я думаю он удовлетворит ваши потребности

Автор: LamerTM 2.8.2009, 17:17
Цитата(wester @ 2.8.2009,  17:04)
LamerTM, 
ну и на чем остановились ?))


PS по одному циклу полагать что он обходит C++ с дотнетом как минимум странно
а вообще пишите на асме если так важна скорость , я думаю он удовлетворит ваши потребности

Я и другие операторы посмотрю. Всякое может быть конечно. Но по-моему и так все ясно. 
Лет 5 назад написал процедуру на асме, чтобы заменить делфийскую для повышения скорости. Скорость не повысилась (в пределах погрешности измерений). Посмотрел код, компилируемый делфи. И проникся, так сказать, глубоким уважением к этому компилятору. Так что писать на асме, имея делфи, совсем не обязательно. Серьезной разницы не получится. В разы - точно. По крайней мере тогда я пришел именно к этом выводу. Тогда тестировался не один цикл, а довольно большая процедура, где было много всего разного.

На чем остановился... да вот на том что надо будет думать как жить дальше на делфи, как обходить эти извраты что понаставили его создатели. Не эти бы ограничения, была бы конфетка.

Автор: diadiavova 2.8.2009, 17:18
LamerTM, а почему бы тебе не попробовать выполнить тест на каких-нибудь реальных вычислениях. Мне показалось, что я достаточно наглядно продемонстрировал, что тесты на липовом коде - не показатель.

Вот пример, добавь в приведённую программу ещё один тест
Код

void test4()
{
    double k = 0;
    for(double i = 0; i < 100000000; i++)
    {
        k = k*k/i;
    }
    cout<<k;
}


Код

       static void test4()
        {
            double k = 0;
            for (double i = 0; i < 100000000; i++)
            {
                k = k * k / i;
            }
        }


На моём компе плюсы показывают 1,168 секунд, а шарп - 1,068. Не 35 раз, конечно, но всё же. Кстати в дебаге шарп тормозит, а плюсы показывают одинаковые результаты. На дельфях проверить не могу.

Автор: diadiavova 2.8.2009, 17:37
В последнем примере ошибку нашёл
Код

void test4()
{
    double k = 0;
    for(double i = 1; i <= 100000000; i++)
    {
        k = k*k/i;
    }
    cout<<k;
}

Код

       static void test4()
        {
            double k = 0;
            for (double i = 1; i <= 100000000; i++)
            {
                k = k * k / i;
            }
        }


Это чтобы на ноль не делить, работает быстрее, но шарп всё равно даёт немного лучшие результаты.

Автор: LamerTM 2.8.2009, 17:54
diadiavova, 

О, это уже интереснее. C# порвал делфю! 

Код делфи:

Код

procedure TForm1.Button1Click(Sender: TObject);
var       i: Integer;
          k: Double;
          dt: TDateTime;
begin
          dt := Now;
          k := 0;
          for i := 1 to 100000001 do k := k * k / i;
          Caption := FloatToStr(k);
          Button1.Caption := IntToStr(MilliSecondsBetween(Now, dt));
end;


На C#:

Код

private void button1_Click(object sender, System.EventArgs e)
        {
            DateTime dd=DateTime.Now;
            double k = 0;
            for (double i = 1; i < 100000001; i++)
            {                  
                k = k * k / i;
            }
            TimeSpan f=DateTime.Now-dd;


            button1.Text=f.ToString();
            Text =k.ToString();
        }
}



Резалты:
делфи: 1608 мс (запуск экзешника такой же)
С#: в дебагере 1.75, запуск екзешника - 1.14

Да, ты прав, тут надо целое исследование проводить.

Автор: wester 2.8.2009, 17:58
LamerTM, 
да зачем исследование , просто есть JIT компиляция и непосредственная компиляция на платформу типа C++ и дельфи

Автор: diadiavova 2.8.2009, 18:01
Экзешник надо именно из папки Release запускать.

Автор: LamerTM 2.8.2009, 18:58
Цитата(diadiavova @ 2.8.2009,  18:01)
Экзешник надо именно из папки Release запускать.

Папка Release это где?



Я вот тут подумал, что код не эквивалентен. В С# перебирается Double, а на Delphi - Integer. Double там нельзя. Из-за чего там еще одна переменная получается.

Но все равно C# рвет старую делфи. А с D2006 вровень. (у меня C# из BDS2006, если что)

Код

procedure TForm1.Button1Click(Sender: TObject);
var       i, c, cc: Integer;
          k: Double;
          dt: TDateTime;
begin
          dt := Now;
          k := 100;
          c := 0;
          cc := 0;
          for i := 1 to 100000001 do
          begin

            if c = 0 then
            begin
              k := k * i;
              c := 1;
            end else
            begin
              k := k / i;
              c := 0;
            end;
            cc := cc + 1;

          end;
          Caption := FloatToStr(k)+' '+IntToStr(cc);
          Button1.Caption := IntToStr(MilliSecondsBetween(Now, dt));
end;


Код

private void button1_Click(object sender, System.EventArgs e)
        {
            DateTime dd=DateTime.Now;
            double k=100;
            int c=0;
            int cc=0;
            for (int i = 1; i <= 100000001; i++)
            {

                if (c==0) { k = k * i; c=1;} else {k = k / i;c=0;}
                cc = cc+1;
                

            }
            TimeSpan f=DateTime.Now-dd;


            button1.Text=f.ToString();
            Text =k.ToString()+' '+cc.ToString();
        }


Резалты:

Delphi 7 - 1563 ms
D2006 - 1000 ms
C# - 1.031 s

Автор: Akella 2.8.2009, 19:00
Цитата(LamerTM @  2.8.2009,  16:55 Найти цитируемый пост)
Цикл на Delphi7 [for i := 0 to 1000000000 do k := k + 1;] компилится в это:

Я где-то читал, что так лучше:

Код

[for i := 0 to 1000000000 do Ink(k)

Автор: LamerTM 2.8.2009, 19:30
Цитата(Akella @ 2.8.2009,  19:00)
Я где-то читал, что так лучше:

Код

[for i := 0 to 1000000000 do Ink(k)

Код генерится один и тот же. Да и как там из тех трех асмовских команд можно сделать лучше, мне, например, не понятно.

Автор: diadiavova 2.8.2009, 20:19
Цитата(LamerTM @  2.8.2009,  19:58 Найти цитируемый пост)
Папка Release это где?

В BDS - не знаю. В VS создаётся два варианта ехешника: один для отладки, другой - как есть, первый запускается не сам по себе, а под контролем дедаггера, естественно на этом производительность падает дальше некуда.
Цитата(LamerTM @  2.8.2009,  19:58 Найти цитируемый пост)
Я вот тут подумал, что код не эквивалентен. В С# перебирается Double, а на Delphi - Integer. Double там нельзя. Из-за чего там еще одна переменная получается.

Код можно изменить, например цикл while или что там в дельфях, это вообще не принципиально, я этот код от фонаря написал, первое, что в голову пришло, а чтобы делать выводы надо много тестов провести.

Добавлено через 43 секунды
Цитата(LamerTM @  2.8.2009,  19:58 Найти цитируемый пост)
у меня C# из BDS2006, если что

Думаю - без разницы.

Автор: neweraser 3.8.2009, 15:11
Цитата(unicuum @  1.8.2009,  23:21 Найти цитируемый пост)
Какой язык больше всего похож на Delphi
Brainfuck 

 smile  и опять религиозные войны!!  smile  лень было читать все, так просмотрел, не знаю к какому выводу пришли, но я за делфи  smile 

Автор: Lazin 3.8.2009, 15:27
господа, вы кажется не учитываете то, что программа на C# - управляемая, тоесть, там весь код - ненативный, и этот код работает быстрее того, что создает компилятор delphi, что говорит о том, что компилятор delphi - очень плохо оптимизирует код
а BDS2006 видимо уже тоже создает .NET приложение, поэтому результат так похож на C#

Добавлено через 1 минуту и 32 секунды
это какбэ намекает нам на то, что Delphi, это lol smile

Автор: LamerTM 11.9.2009, 09:56
Сегодня выяснилось что работа с Clipboard в C# в 3-5 раз медленнее чем в Delphi. Интересно, где еще в C# такие тормоза. Лучше бы знать это сразу, а не после того как мегабайт исходников напишу.

Автор: Lazin 11.9.2009, 10:37
Цитата(LamerTM @  11.9.2009,  09:56 Найти цитируемый пост)
а не после того как мегабайт исходников напишу
1Мб исходников?
допустим ты нажимаешь клавишу 1 раз в секунду, тогда, что-бы написать 1Мб исходников, тебе потребуется более 12 часов непрерывной работы smile

Автор: NightmareZ 12.9.2009, 01:17
Ааааа!!!! Тема доставляет.

Аффтар сферический долбламер в вакууме. Тот самый, про которого ходят легенды и складают былины.

Жгите дальше, я подписался.

Автор: Rohoss 12.9.2009, 17:10
Среди ИТ-шников ооочень не редки случаи фанатизма. Но в некоторых он достигает умопомрачительных высот  smile 

Автор: RockClimber 13.9.2009, 00:24
Цитата(LamerTM @  31.7.2009,  18:01 Найти цитируемый пост)
Умные делфисты предлагают "продумать структуру". В переводе на русский: свалить весь код в один модуль.

Вот если честно, не очень верится, что умные делфисты советовали свалить весь код в один модуль (вот если не секрет, конечно, можно ссылку, где это советовали?). Если же "свалить все в один модуль" - это единственное, что приходит в голову автору, то могу только поддержать вариант "прекратить развитие программы".
Кстати, циклические ссылки в Delphi делать можно. Модуль 1 ссылается на модуль 2 в разделе interface, а модуль 2 на модуль 1 - в разделе implementation. Этакая "получиклическая" ссылка. Точно не помню, но вроде должно работать.
Есть еще visual basic, там все модули друг друга видят одновременно, и более того, их друг от друга скрыть просто нельзя (максимум, сделать приватные методы и переменные).

Лирическое отступление:
Когда Ахматова показала свои первые стихи мужу, тот посоветовал ей заняться танцами. Однако она своего добилась и получила признание вовсе не в балете. Автор топика пока находится на стадии таких вот "первых стихов", имхо...

Добавлено через 4 минуты и 8 секунд
Цитата(LamerTM @  2.8.2009,  16:55 Найти цитируемый пост)
Купил сегодня Borland Developer Studio 2006. За 200 рублей. Надеюсь оно того стоит.

Ну точно ламер. Все нормальные люди качают из торрентов, бесплатно и не выходя из дома.
А если серьезно, сформулируй проблему в наиболее общем виде и почитай книжку про паттерны. Вдруг что пригодится...

Добавлено через 6 минут и 16 секунд
Ах да, проблема должна быть сформулирована не "как сделать-таки циклическую ссылку" а "какая еще структура данных может решить мою задачу".

Автор: LamerTM 13.9.2009, 08:44
Цитата(RockClimber @  13.9.2009,  00:24 Найти цитируемый пост)
Вот если честно, не очень верится, что умные делфисты советовали свалить весь код в один модуль (вот если не секрет, конечно, можно ссылку, где это советовали?).

http://programmersforum.ru/showthread.php?p=303360
http://www.aspfree.com/c/a/.NET/The-Delphi-Language-Part-2/3/

Цитата(RockClimber @  13.9.2009,  00:24 Найти цитируемый пост)
Если же "свалить все в один модуль" - это единственное, что приходит в голову автору, то могу только поддержать вариант "прекратить развитие программы".

Программу я еще несколько месяцев назад решил переписать всю заново, с нуля. В любом случае буду это делать. Вопрос был только в том, на каком это будет языке.

Цитата(RockClimber @  13.9.2009,  00:24 Найти цитируемый пост)
Кстати, циклические ссылки в Delphi делать можно. Модуль 1 ссылается на модуль 2 в разделе interface, а модуль 2 на модуль 1 - в разделе implementation. Этакая "получиклическая" ссылка. Точно не помню, но вроде должно работать.

Не будет работать. Классы имеют ссылки друг на друга в своем объявлении, которое в интерфейсной части. Для таких вещей в делфи придуманы предварительные объявления классов. Но они работают только внутри одного модуля. А для классов в разных модулях такое не придумали.


Цитата(RockClimber @  13.9.2009,  00:24 Найти цитируемый пост)
Ах да, проблема должна быть сформулирована не "как сделать-таки циклическую ссылку" а "какая еще структура данных может решить мою задачу".

Да решить-то задачу можно. Но это же будет изврат. Писать таким образом неудобно. Я хочу чтобы программирование было удобным, а не самоистязанием. В паскале и так много лишних телодвижений надо делать. Мне он всегда этим не нравился.


Цитата(RockClimber @  13.9.2009,  00:24 Найти цитируемый пост)
Есть еще visual basic, там все модули друг друга видят одновременно, и более того, их друг от друга скрыть просто нельзя (максимум, сделать приватные методы и переменные).

Я на C# остановился. Почти портировал одну свою небольшую программку. Приятный язык конечно. Только клипбоард что-то тормозит. Думаю как его можно ускорить.

Автор: NightmareZ 13.9.2009, 13:58
Цитата(LamerTM @  13.9.2009,  08:44 Найти цитируемый пост)
Программу я еще несколько месяцев назад решил переписать всю заново, с нуля. В любом случае буду это делать. Вопрос был только в том, на каком это будет языке.


Что за программа? Мне для себя, поржать.

Автор: Artemon 13.9.2009, 14:38
LamerTM, это ваш код ?

Код

define("_WINDOWS_",file_exists("c:\autoexec.bat") ? TRUE : FALSE);

Автор: RockClimber 13.9.2009, 15:42
LamerTM, по приведенным выше ссылкам только вопросы про циклические ссылки и никаких попыток объяснить, зачем они нужны. Могу только удачи пожелать, она вам понадобится...

Автор: LamerTM 13.9.2009, 15:56
Цитата(RockClimber @ 13.9.2009,  15:42)
LamerTM, по приведенным выше ссылкам только вопросы про циклические ссылки и никаких попыток объяснить, зачем они нужны.

А какая разница зачем они нужны. Есть задача сделать циклические ссылки. А для чего - это к вопросу не относится.

Автор: NightmareZ 13.9.2009, 16:52
Цитата(LamerTM @  13.9.2009,  15:56 Найти цитируемый пост)
А какая разница зачем они нужны.


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

Автор: LamerTM 13.9.2009, 17:26
Цитата(NightmareZ @ 13.9.2009,  16:52)
Разница большая. Есть подозрение, что ты жутко тупишь. Ибо я за семь лет программирования самых разных задач на самых разнообразных языках ни разу не встречал необходимости создать "циклические ссылки".

Ну если у тебя были задачи только из университета, то конечно.
Впрочем, я уже понял что у крутых программеров, которые не тупят, ничего более сложного, чем кидать на форму компоненты, не было.


PS
В 23 года 7 лет программирования ?  smile Это с 16 лет что-ли? smile Я себе таким макаром могу и побольше срок написать. Мне 27, я пишу с 12 лет. У меня тогда стаж 15 лет. smile  На самых разных языках и компах. Мечтал стать программистом когда-то. Но это всё в прошлом. Таки меня потянуло на воспоминания. smile

Автор: NightmareZ 13.9.2009, 19:49
Цитата(LamerTM @  13.9.2009,  17:26 Найти цитируемый пост)
Ну если у тебя были задачи только из университета, то конечно.Впрочем, я уже понял что у крутых программеров, которые не тупят, ничего более сложного, чем кидать на форму компоненты, не было.


Я не буду показывать коммерческие проекты, в которых участвовал. Ибо нет желания светиться где я работал. Но на поделки, которыми я занимаюсь в свободное время, ссылки дам. Думаю, этого будет достаточно.

http://flowchartbuilder.blogspot.com/ - редактор диаграмм.
Применяемые средства: C#, VB.NET, F#.

http://savepic.ru/776939.htm  http://savepic.ru/745028.htm


http://makarov-bulldozer.blogspot.com/ - редактор карт высот.
Применяемые средства: C#.

http://savepic.ru/777963.htm


http://makarov-physics.blogspot.com/ - комплекс физических программ (версия 2).
Применяемые средства: изначально писал на Delphi, но сейчас перевёл разработку на C#.

http://savepic.ru/774891.htm  http://savepic.ru/768747.htm

Можешь глянуть ещё моё портфолио на фриланс.ру:  http://freelance.ru/users/NightmareZ

Цитата(LamerTM @  13.9.2009,  17:26 Найти цитируемый пост)
В 23 года 7 лет программирования ?

Представляешь, да, я с 16 лет работал программистом.

Цитата(LamerTM @  13.9.2009,  17:26 Найти цитируемый пост)
Я себе таким макаром могу и побольше срок написать. Мне 27, я пишу с 12 лет. У меня тогда стаж 15 лет.

Разница между нами в том, что я семь лет участвовал в разработке крупных проектов в командах от 20 человек, ты же в это время онанировал на Бритни Спирс.

Автор: LamerTM 13.9.2009, 20:33
Улыбнуло. smile  Задело, что-ли? Расслабься. Мне ты не интересен. Сравниваться с тобой тем более. То чем ты занимаешься это вообще всё чушь. Я считаю программирование простым занятием, тут нечем выпендриваться. Поэтому со мной не надо сравниваться в программировании. Посмешишь - максимум. Ты сюда в эту ветку пришел чтобы самоутвердиться что-ли и доказать что ты круче меня? smile Ну круче, круче, успокойся. Я специально для таких как ты даже в ник себе написал что ламер, лишь бы только все отстали. Ан нет же, лезут меряться.

Цитата(NightmareZ @  13.9.2009,  19:49 Найти цитируемый пост)
ты же в это время онанировал на Бритни Спирс.

Безосновательный переход на личности. Ты что видел как я онанировал на Бритни Спирс? Нет. Значит выдумал. Может ты и всё остальное выдумал (про коммерческие проекты свои)? smile И к чему эти оскорбления? Я тебя оскорблял? Детсад.

Ну я надеюсь ты хотя бы поржал, а то ведь подписывался? smile 

Автор: Lazin 13.9.2009, 20:47
а у меня 22 сантиметра, losers smile

Автор: RockClimber 13.9.2009, 20:53
Дальше говорить бесполезно, сдаюсь.
Я пацтолом.
 smile 

Автор: Akella 14.9.2009, 10:22
smile

Автор: Shaggie 14.9.2009, 11:26
Цитата(LamerTM @  13.9.2009,  20:33 Найти цитируемый пост)
Я считаю программирование простым занятием, тут нечем выпендриваться.

Тогда понятно, отчего такие вопросы появляются. И про циклические ссылающиеся классы, и про наиболее дельфеобразные языки.

Цитата(LamerTM @  2.8.2009,  15:43 Найти цитируемый пост)
Не понял о чем это, но похоже это какое-то извращение. Мне надо было вставить одну ссылку. А тут столько писать. Да еще модули дополнительные. Вот в упор не понимаю зачем они. С точки зрения здравого смысла не понимаю. Хотя с точки зрения компилятора делфи они может быть и необходимы.

"Абстрактный класс", "наследуются", "от предка", хм... так все же классы потомки TObject. Ну я тормоз. Можно определить поле как TObject. А потом обращаться к нему через as. Будет как через ass, но на первое время сойдет. Геморно конечно и неудобно, и даже слегка извращенно, но по крайней мере новых модулей делать не надо и код в кашу смешивать тоже.

Ну конечно, что нет ничего проще и тупее программирования. Тут и спорить не о чем.

Цитата(LamerTM @  31.7.2009,  18:01 Найти цитируемый пост)
Умные делфисты предлагают "продумать структуру". В переводе на русский: свалить весь код в один модуль.

А вы у них спросили перевод на русский, или он сам собой придумался? Предложение-то вовсе не лишено смысла. Alexeis уже посоветовал решение с продуманной архитектурой, поразмысли над ним. Это лучше, чем флудотроллинг разводить.

Автор: ConstantinXXX 20.9.2009, 21:31
Кто считает что Делфи лол, тот просто не умеет кодить, это типа если сказать что китайский лучше чем английский. Выразить свои эмоции можно как на китайском так и на английском, проблемма может заключаться только в недостаточном знание одного из языков. Так и тут. 
А как вам такая идея, нет универсального языка! ;) Кодер не говорит я умею юзать C++ или Делфи, он говорит а на каком языке надо? ;)

Если скорость работы проги не зависит от рук, то:
Цитата

Компилированная программа должна работать очень быстро. Т.е. язык не должен быть интерпретируемым.

заюзай асм. smile

Если вы говорите что делфи это лол, то как вам Бейсик? ;)

Кому интересно почитайте вот это: http://orencode.info/forum/showthread.php?t=2458
думаю мнение о том что с++ круче делфи, а делфи круче бейсика у вас пропадет. ;)

Автор: wester 20.9.2009, 23:07
ConstantinXXX, 
про японский язык и эмоции.... если оба собеседника знают английский зачем нужен китайский ?))

и кодер вообще чаще всего молчит , так как чаще всего говорят что надо и как , а как это будет РЕАЛЬНО реализоваться заказчику очень часто бывает все равно , главное что бы работало 

pureBasic это вообще какой то страх божий, по сравнению с ним любой BrainFuck кажется намного проще 

Автор: ConstantinXXX 20.9.2009, 23:48
wester, вот я про тоже, если оба знают китайский тогда зачем им другой язык, тут тоже самое если хорошо знаешь делфи, то и с++ не нужен, и так же наоборот. 

А насчет пуребейсика чет недопонял, хочешь сказать что вот это: http://orencode.info/forum/showthread.php?t=1076

лучше чем pureBasic  smile 

Автор: wester 21.9.2009, 15:42
ConstantinXXX,
угу, именно так 
после pureBasic , человек с нулевым опытом программирования вообще не поймет , что такое утечки памяти и зачем нужны всякие классы и методы  
это так сказать кузница всяких ###-кодеров, которые вместо for будут цепочки goto и прочие перлы
BrainFuck хотя бы показывает что есть ячейки памяти и как с ними работать 

Автор: ConstantinXXX 21.9.2009, 17:12
wester, а зачем новичку это? smile
Думаю у начинающих и так проблем будет докучи, и без всяких утечек памяти и т.п. ;)

Автор: DeadLine 21.9.2009, 17:13
Повторюсь с началом темы,но английский

Автор: wester 21.9.2009, 17:44
ConstantinXXX, 
начинающему до поры незачем , но такие поделки как pureBasic , портят весь будущий стиль написания программ 

Автор: ConstantinXXX 21.9.2009, 18:16
wester, да чем же pureBasic вам не нравиться? =)
Я тоже думал что бейсик это фигня, но после вот этих статей:

http://orencode.info/forum/showthread.php?t=2458
http://orencode.info/forum/showthread.php?t=2528
http://orencode.info/forum/showthread.php?t=2493
http://orencode.info/forum/showthread.php?t=2461

сменил свое мнение, если бы было свободное время начал бы юзать его (для саморазвития). ;)

Автор: wester 21.9.2009, 18:38
ConstantinXXX, 
таки не увидел ничего выдающегося , скажи ради чего нужно знать основы pureBasic? 

 читал листинги и думал что с таким диалектом семейство basic-подобных языков очень сильно отупело и застопорилось

Автор: ConstantinXXX 21.9.2009, 18:56
wester, я просто показал альтернативу. smile
Я лично начинал программирование с VB.net. Потом самостоятельно перебрался на делфи, а потом понеслось, php, асм, html smile и т.д. 
Так что не надо говорить что например делфи хуже чем с++ и т.п., smile

Автор: wester 21.9.2009, 22:53
ConstantinXXX, 
сам начинал с pascal , еще со школьной скамьи , сейчас крепко засел за C#))

во многих аспектах delphi конечно хуже.... хотя скорее это во мне говорит отвращение ко всем паскалеподобным языкам))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)