Страница: 1 | 2 |
я вообще большой любитель Васика но вот попробовал приведенные примеры (правда там ошибка) c# 0.04 сек vb.net 3.1 сек Вот гады, они наверное что-то специально сделали что бы медленее работало А теперь вопрос в каких еще случаях это критично или же во всех c# настолько быстрее можно ли расчеты писать на c# ? Я проверил - действительно C# намного быстрее. ( Попробовал дизассемблировать (ildasm.exe). Для VB.Net: IL_001f: ldc.i4.0 Для VC#: IL_001e: ldc.i4.0 Очевидно, VC# использует pop вместо stloc.1 и т.д., но я хотя и вижу разницу, но не могу пока понять, почему один быстрее. Может кто-нибудь обьяснить ? тут цикл TimeSpan timeTaken1 = А это выводил в mesagebox timeTaken1.TotalSeconds.ToString() Да, я тоже почти так мерял. Кстати, у VC# есть в свойствах проекта - Optimize Code. Если отключить, скорость его и VB становится равной. В VB тоже есть Enable optimizations, но разницы при нём включенном и выключенном я не заметил. Может, баг Microsoft ? Тем более что параметры компиляторов VB и VC# для обоих этих свойств "/optimize". Хотя и для разных компиляторов, но ведь не зря всё делали схожим. У меня на всяких сложных штуках разрыв немного сократился но все равно есть. Помоему этот г... действительно не делает оптимизацию Я идиот ! Понял ! Вот в чём оптимизация VC# ! Мы после этого цикла ни разу не запрашиваем значение k, поэтому он просто ему ничего и не присваевает ! Он просто удаляет полученное при делении значение из стека в никуда ! А VB присваивает в любом случае. Проверил - теперь почти одинаково ! Я сделал клас в котором хранится рад данных целых, даллов порядка, строка 15 потом с помощью датаридер АДО.Нет все считываю. Код на ВБ и С# индентичен вплоть до строчек Но считвание данных 70000 объектов из бд vb = 3.8 c c#=3.2 c еще у меня сложилось мнение что из обычных длл функции и процедуры вызываются в разы медленнее чем встроенные функции, да помоему в с# из длл быстрее вызывает 2Darxeth Я бы согласился, по поводу помещения в стек, но нашел еще другие отличия в производительности. Вот код: VB как вы поняли пример №1 показывает, что VB, как и раньше, не оптимизирует обработку операторов ветвления, а второй, что математика тоже не оптимизируется (пр. X=0*Y) в отличии от C#. Хотя это всего лишь предположения, ответ может дать только асм, а я за него еще не брался. Не знаю. Первый пример показывает у меня одинаковый результат. Ты не забыл поставить в VB-опциях Remove Integer Overflow Checks ? Что касается ветвления - C#'чному && эквивалентно не And, а AndAlso. Второй пример посмотрел в asm (то есть в MSIL) - абсолютно идентичен. Кстати, интересно, что MSIL всё считает в стеке. add value1 value2 то MSIL фактически push value1 Забавно. Remove Integer Overflow Checks поставлен, но код идентичный вплоть до строчки - заполнение из бд в массив классов работает медлее на 0.6 с вообще не понятно почему А вопрос почему настолько медленее вызываются фукции из обычных длл мне вообще не понятен. В c# помоему быстрее Я в vb даже полную проверку данных включил.
Вопрос: Что быстрее VB.NET или C#?
Добавлено: 14.12.02 16:21
Автор вопроса: sterling
Ответы
Всего ответов: 25
Номер ответа: 16
Автор ответа:
Kulibin
Вопросов: 7
Ответов: 13
Профиль | | #16
Добавлено: 07.01.03 18:31
Номер ответа: 17
Автор ответа:
Андрей Щёкин [darxeth]
ICQ: 161560107
Вопросов: 9
Ответов: 52
Web-сайт:
Профиль | | #17
Добавлено: 07.01.03 20:59
Кстати, а как вы измеряли скорость ?
Конкретно этот цикл:
IL_0020: stloc.0
IL_0021: ldloc.0
IL_0022: conv.r8
IL_0023: call float64 [mscorlib]System.Math::Sin(float64)
IL_0028: ldloc.0
IL_0029: conv.r8
IL_002a: call float64 [mscorlib]System.Math::Cos(float64)
IL_002f: div
IL_0030: stloc.1
IL_0031: ldloc.0
IL_0032: ldc.i4.1
IL_0033: add.ovf
IL_0034: stloc.0
IL_0035: ldloc.0
IL_0036: ldc.i4 0x989680
IL_003b: ble.s IL_0021
IL_001f: stloc.0
IL_0020: br.s IL_0036
IL_0022: ldloc.0
IL_0023: conv.r8
IL_0024: call float64 [mscorlib]System.Math::Sin(float64)
IL_0029: ldloc.0
IL_002a: conv.r8
IL_002b: call float64 [mscorlib]System.Math::Cos(float64)
IL_0030: div
IL_0031: pop
IL_0032: ldloc.0
IL_0033: ldc.i4.1
IL_0034: add.ovf
IL_0035: stloc.0
IL_0036: ldloc.0
IL_0037: ldc.i4 0x989680
IL_003c: blt.s IL_0022
Номер ответа: 18
Автор ответа:
Kulibin
Вопросов: 7
Ответов: 13
Профиль | | #18
Добавлено: 07.01.03 21:57
long startTime = DateTime.Now.Ticks;
Номер ответа: 19
Автор ответа:
Андрей Щёкин [darxeth]
ICQ: 161560107
Вопросов: 9
Ответов: 52
Web-сайт:
Профиль | | #19
Добавлено: 07.01.03 22:10
Номер ответа: 20
Автор ответа:
Kulibin
Вопросов: 7
Ответов: 13
Профиль | | #20
Добавлено: 07.01.03 23:11
Номер ответа: 21
Автор ответа:
Андрей Щёкин [darxeth]
ICQ: 161560107
Вопросов: 9
Ответов: 52
Web-сайт:
Профиль | | #21
Добавлено: 08.01.03 13:47
Номер ответа: 22
Автор ответа:
Kulibin
Вопросов: 7
Ответов: 13
Профиль | | #22
Добавлено: 08.01.03 15:39
Номер ответа: 23
Автор ответа:
SAVok
ICQ: 155153916
Вопросов: 2
Ответов: 126
Профиль | | #23
Добавлено: 08.01.03 17:55
Dim i As Int32 = 0, j As Int32 = 3, k As Int32 = 343, m As Int32 = 0, l As Int32, tmp As Int32
Dim si As Single = 0.0F, sj As Single = 3.0F, sk As Single = 3453.0F, sm As Single = 0, stmp As Single
Dim tm As Single = System.DateTime.Now.Millisecond, ta As Single
For l = 0 To 100000000
' Sample #1
'If i = 1 And j = 3 Then k = k + 1
' Sample #2
'm = j * i * k
'sm = sj * si * sk
Next
ta = System.DateTime.Now.Millisecond - tm
MsgBox(ta)
l = k / 2
tmp = m
stmp = sm
C#
Int32 i=0,j=3,k=343,m=0,l,tmp;
Single si=0F,sj=3F,sk=3453F,sm=0,stmp;
Single tm=System.DateTime.Now.Millisecond,ta;
for(l=0;l<=100000000;l++)
{
// Sample #1
// if(i==1 && j==3)
// k++;
// Sample #2
// m=j*i*k;
// sm=sj*si*sk;
}
ta=System.DateTime.Now.Millisecond-tm;
MessageBox.Show(ta.ToString());
l=k/2;
tmp=m;
stmp=sm;
Номер ответа: 24
Автор ответа:
Андрей Щёкин [darxeth]
ICQ: 161560107
Вопросов: 9
Ответов: 52
Web-сайт:
Профиль | | #24
Добавлено: 09.01.03 01:10
В VC# оно стоит по умолчанию.
Сейчас меня и скорость идентична. Проверь Remove Integer Overflow Checks.
Если asm делает
push value2
add
Номер ответа: 25
Автор ответа:
Kulibin
Вопросов: 7
Ответов: 13
Профиль | | #25
Добавлено: 09.01.03 12:44