Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скорость C#, почему так? 
:(
    Опции темы
bankuss
Дата 5.5.2004, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 26.3.2004

Репутация: нет
Всего: 4



Решил я сравнить примерную скорость работы с числами и массивами 3-х языков: VB6, VB.net и C#.
И вот что вышло:
задачка такая - есть массив 800 на 800 набитый числами типа double. Производим его сортировку по возрастанию - по каждой линии отдельно (т.е. 800 сортировок по 800 чисел)
И вот время выполнения:
VB6 - 7 секунд
VB.net - 11 секунд
С# - 44 секунды (!!!)
Что вы на это скажите?

P.S. код в каждой программуле идентичный, все компилилось в exe (с оптимизациями на скорость) и там все мерялось (по 3 раза). машина - С-1300\256
PM MAIL   Вверх
AntonSaburov
Дата 5.5.2004, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 6
Всего: 118



Странно. И не объяснить это без кода. Хорошо бы код показать.
PM MAIL WWW ICQ   Вверх
bankuss
Дата 5.5.2004, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 26.3.2004

Репутация: нет
Всего: 4



вот бейсиковский текст проги:

Dim a As Integer
Dim b As Integer
Dim c As Integer
Dim dat As Double
Dim dat2 As Double
Dim mass(800, 800) As Double
Label1.Text = "START"
Form1.ActiveForm.Refresh()
For a = 0 To 800
For b = 0 To 800
dat = 1 + Rnd()
mass(a, b) = dat
Next b
Next a
For b = 0 To 800
For a = 0 To 800
For c = 1 To 800
dat = mass(a, b)
dat2 = mass(c, b)
If dat > dat2 Then mass(a, b) = dat2 : mass(c, b) = dat
Next c
Next a
Next b
Label1.Text = "END"
End Sub

PM MAIL   Вверх
Гость_anton_misa
Дата 5.5.2004, 16:57 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











а ты много раз запускал эту программу? и все тот же результат?
  Вверх
Kurt
Дата 5.5.2004, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: 20
Всего: 36



bankuss, прости, но ты что-то не то говоришь..
У меня AMD1600/256RAM.
Машина очень загружена - музыка, студия, 3 СУБД, но здесь эт не столь важно.
Вот мои переводы:

VB.NET:
Код

Module MainModule

   Sub Main()
       Dim mass(800, 800) As Double
       Dim i As Integer
       Dim j As Integer
       Dim a As Integer
       Dim b As Integer
       Dim c As Integer
       Dim MyRnd As Random = New Random()

       For i = 0 To 800
           For j = 0 To 800
               mass(i, j) = 1.0 + MyRnd.NextDouble()
           Next j
       Next i

       Dim dat, dat2 As Double
       Console.WriteLine("Starting.. Press <Enter>")
       Console.Read()
       Dim dt1 As DateTime = System.DateTime.Now
       For b = 0 To 800
           For a = 0 To 800
               For c = 1 To 800
                   dat = mass(a, b)
                   dat2 = mass(c, b)
                   If dat > dat2 Then mass(a, b) = dat2 : mass(c, b) = dat
               Next c
           Next a
       Next b

       Dim dt2 As DateTime = System.DateTime.Now
       Console.WriteLine("Done.")
       Console.WriteLine("Time: " + dt2.Subtract(dt1).ToString())
       Console.Read()
       Console.Read()

   End Sub

End Module


C#
Код

using System;

namespace SortSpeedTest
{
class CMain
{
 static void Main()
 {
  Random rnd = new Random();
  double[,] mass = new double[801,801];
  for (int i=0; i<801; i++)
  {
   for (int j=0; j<801; j++)
   {
    mass[i,j] = 1.0+rnd.NextDouble();
   }
  }
  double dat,dat2;
  Console.WriteLine("Starting.. Press <Enter>");
  Console.Read();
  DateTime dt1 = System.DateTime.Now;
  for (int b=0; b<801; b++)
  {
   for (int a=0; a<801; a++)
   {
    for (int c=1; c<801; c++)
    {
     dat = mass[a,b];
     dat2 = mass[c,b];
     if (dat>dat2)
     {
      mass[a,b]=dat;
      mass[c,b]=dat;
     }
    }
   }
  }
  DateTime dt2 = System.DateTime.Now;
  Console.WriteLine("Done");
  Console.WriteLine("Time: "+dt2.Subtract(dt1).ToString());
  Console.Read();
  Console.Read();
  return;
 }
}
}


Как видишь, я тут очень грубо время вычислял время, но нам хватит.
Вобщем результаты:
VB.NET - в среднем 33-36 сек.
C#.NET - 30-34 сек.
(ну там из-за 1-го, 2-го запусков и т.п.)

Далее..
VB6 я тож проверил.
Тока сначала один вопрос - ты уверен, что
Цитата
Label1.Text = "START"

это из VB6? Там тока Label1.Caption.. Иль ты VB.NET и имел ввиду?..
Итак. Запустил я VB6-код, приготовился уловить момент в 7 секунд, ОДНАКО! Мой комп трудился на этими нехитрыми строчками почти 3,5 минуты! (еще запустил - таже картина)
Можь, ты чего-то не то посчитал?
Или это я где стормозил?.. hmmm.gif


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
bankuss
Дата 6.5.2004, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 26.3.2004

Репутация: нет
Всего: 4



Да это код из VB.net а в 6-м бейсике конечно label1.caption вместо label1.text
PM MAIL   Вверх
bankuss
Дата 6.5.2004, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 26.3.2004

Репутация: нет
Всего: 4



подредактировал я свои проги - вставил System.DateTime.Now, функцию rnd в vb.net сделал как у тебя (похоже на C#). Все перепроверил 20 раз и еще раз протестировал.
Кстати у тебя C# коде ошибка:
mass[a,b]=dat; - здесь надо dat2
mass[c,b]=dat;
ну это мелочи smile.gif
Единственное отличие - я замер времени делаю с заполнения массива по завершение его сортировки., а у тебя меряется тока сортировка т.е. я вставляю DateTime dt1 = System.DateTime.Now перед заполнением массива.
И еще я проги деляю в виде формы с кнопкой, консоль не использую.
Теперь про VB6 - при компиляции ставишь на скорость и в advanced везде ставишь галки. Таким образом убираются всякие проверки.
И вот результаты:
VB6 - 6-7 секунд
VB.net - 11 секунд
C# - 11 секунд (наконец-то!)
мерял по 5 раз.
Вот такие дела...
PM MAIL   Вверх
AntonSaburov
Дата 6.5.2004, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 6
Всего: 118



Цитата
И вот результаты:
VB6 - 6-7 секунд
VB.net - 11 секунд
C# - 11 секунд (наконец-то!)

Это уже очень похоже на правду.
PM MAIL WWW ICQ   Вверх
Дрон
Дата 13.5.2004, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Цитата
VB6 - 6-7 секунд
VB.net - 11 секунд
C# - 11 секунд (наконец-то!)

Так что же это получается, что C# в любом случае медленнее, чем VB6? sad.gif




--------------------
Да. Именно так.
PM   Вверх
Kurt
Дата 13.5.2004, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: 20
Всего: 36



Не согласен.
Как я уже отмечал - у меня VB6 работает ГОРАЗДО медленнее.
Операционная система - WinXP SP2.


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
bankuss
Дата 14.5.2004, 07:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 26.3.2004

Репутация: нет
Всего: 4



У меня тоже WinXP, только - SP1а.
C# приближается к VB6 только в консольном режиме (у меня получается 8 секунд), но VB6 все равно быстрей, что странно. Все-таки сишные компиляторы считаются самыми быстрыми.
PM MAIL   Вверх
Дрон
Дата 14.5.2004, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Решил я сам проверить.
Дело в том, что в своих прогах я большое внимание уделяю быстродействию кода, часто дописываю что-нибудь на ассемблере и т.д.

Так вот результаты работы этой проги на AthlonXP 2500+ в WinXP:

~95c. - VB6 без компиляции (запущен из среды разработки);
~10c. - C# опции Release;
~10c. - VB.NET опции Release.
~10c. - VB6 в .exe с Optimize for Fast Code только;
~8c. - VB6 в .exe с Fast Code, Pentium Pro, Remove Array Bounds checks, Remove Safe Pentium FDIV, Allow Unrounded Floating Point;

Ну и смеха ради:
~4,2c. - C++Builder 6 со всеми оптимизациями;
~3,2с. - Visual C++ 6.0 с оптимизацией Speed, Pentium Pro;
~3,1c. - Visual C++ .Net (unmanaged) со всякими оптимизациями.
В managed C++ я откомпилировать не сумел.

Kurt, обрати внимание на первый результат, видимо ты так и получил эти 3,5 минуты.

Печально становится, товарищи, от такого быстродействия великого и могучего C# sad.gif



--------------------
Да. Именно так.
PM   Вверх
bankuss
Дата 17.5.2004, 06:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 26.3.2004

Репутация: нет
Всего: 4



Спасибо мелкософту за такую скорость С#
smile.gif
PM MAIL   Вверх
chipset
Дата 17.5.2004, 07:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 1
Всего: 165



Кто нибудь пробовал замерять быстродействие той же программы под ДОСом?
Цитата
~4,2c. - C++Builder 6 со всеми оптимизациями;

В очередной раз потверждает то что BC++ мертв...

Это сообщение отредактировал(а) chipset - 17.5.2004, 07:31


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
stab
Дата 17.5.2004, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



Цитата
Печально становится, товарищи, от такого быстродействия великого и могучего C#


C# тут ни при чем, все дело в самой платформе .net, просто, надо принять как должное, что .net код работает несколько медленей, чем native код.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1010 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.