Хотелось бы прокоменнтировать данную статью:
Есть конечно же и у других языков свои плюсы и Вы вправе выбрать любой из них для своих научных исследований, но я считаю, что на ближайшие лет 10 Visual Basic 6.0 в сочетание с Free Basic (или без него) это наилучший выбор для научных работников.
Считается, что для научных исследований в первую очередь важна скорость вычислений. Например моделирование ядерных взрывов, декодирование зашифрованных сообщений, моделирование автомобильных аварий, радиоастраномия, генетические алгоритмы.
Значит во главу угла ставится скорость вычислений, и максимально эффективное использование сопроцессора. Компилятор должен уметь оптимизировать математические вычисления, а также очень важно, уметь оптимизировать ветвления. Осуществлять балансировку и трамбовку логического дерева конструкций Select Case и IF-THEN.
Для примера сравним VB c PowerBASIC for Windows. Хотя бы потому, что в PB абсолютно средний, ничем не выдающийся оптимизирующий компилятор. Из оптимизаций в основном только сжатие цепочки переходов, удаление общих подвыражений, размножение констант, снижение мощности инструкций, удаление недостижимого кода и размещение переменных в регистрах.
Для начала тест эффективности мат. выражений, цикл из 1 млн. итераций: арифметические функции, SIN, COS, TAN, SQR, возведение в степень. Будем смотреть как VB и PB умеют использовать сопроцессор для вычислений с плавающей точкой.
Для верности запускаем примеры по 10 раз, а потом вычисляем среднее время.
Тестовая машина: двухядерный P-4, частота 3 Ггц, ОЗУ-512 мбайт, WindowsXP SP2.
Математический тест
- Код: Выделить всё
Declare Function GetTickCount Lib "KERNEL32.DLL" () As Long
Const maxtest = 1000000
Sub Main()
Dim t As Double
Dim i As Long
Dim x As Double
Dim Z As Double
Dim u As Long
Dim TestString As String
t = GetTickCount - t
u = GetTickCount
x = 1
For i = 1 To maxtest
'-----------------------------------------------
t = Sin(i)
t = t + i - 1
t = t * i
t = t / i
t = Cos(i) / t + i
t = x ^ i
x = Sqr(t)
Z = Tan(i)
'------------------------------------------------
Next i
u = GetTickCount - u
MsgBox (u) & " milliseconds"
End Sub
Результаты теста:PowerBasic 8.03 (эффективность математических вычислений)
--------------------------
641 мсек
641 мсек
657 мсек
640 мсек
641 мсек
656 мсек
641 мсек
640 мсек
641 мсек
640 мсек
------------------------
Среднее время вычислений: 643,8 мсек
Visual Basic 6.0 (эффективность математических вычислений)
---------------------------
859 мсек
859 мсек
844 мсек
859 мсек
860 мсек
844 мсек
843 мсек
844 мсек
843 мсек
844 мсек
------------------------
Среднее время вычислений: 849,9 мсек
Итог: PowerBasic производит математические операции на 25% быстрее, чем Visual Basic.
И это еще без размещения переменных в регистрах процессора, и прочих ручных оптимизаций.
Для вычислений продолжающихся много часов подряд, это даже не отрыв, это - пропасть!
Скорее всего, VB не умеет эффективно использовать сопроцессор.
Поэтому юзать VB для длительных, математических и научных расчетов нерационально.
Теперь перейдем к более интересному тесту, проверку эффективности конструкций Select Case.
В сложных математических и статистических расчетах часто требуется фильтрация большого объема
входных данных. Без Select Case никуда не деться, это одна из самых медленных инструкций в программе.
Хороший оптимизирующий компилятор должен уметь, строить эффективное логическое дерево, а также
осуществлять балансировку и "трамбовку" логического дерева.
На рисунке слева неоптимизированное дереово, справа оптимизированное.
Select Case и IF-THEN тест- Код: Выделить всё
Declare Function GetTickCount Lib "KERNEL32.DLL" () As Long
Const maxtest = 1000000
Sub Main()
Dim t As Long
Dim i As Long
Dim x As Long
Dim u As Long
Dim TestString As String
t = GetTickCount - t
u = GetTickCount
x = 1
For i = 1 To maxtest
Select Case TestString
Case "String1"
x = 2
Case "String2"
x = 3
Case "String3"
x = 4
Case "String4"
x = 5
Case "String5"
x = 6
Case "String6"
x = 7
Case "String7"
x = 1
End Select
If x = 1 Then TestString = "String1"
If x = 2 Then TestString = "String2"
If x = 3 Then TestString = "String3"
If x = 4 Then TestString = "String4"
If x = 5 Then TestString = "String5"
If x = 6 Then TestString = "String6"
If x = 7 Then TestString = "String7"
Next i
u = GetTickCount - u
MsgBox (u) & " milliseconds"
End Sub
Результаты теста:
PowerBasic 8.03 (эффективность конструкций Select Case и IF )
--------------------------
250 мсек
250 мсек
265 мсек
265 мсек
250 мсек
250 мсек
250 мсек
265 мсек
250 мсек
250 мсек
------------------------
Среднее время вычислений: 254,5 мсек
Visual Basic 6.0 (эффективность конструкций Select Case и IF )
---------------------------
500 мсек
500 мсек
500 мсек
500 мсек
500 мсек
500 мсек
500 мсек
500 мсек
500 мсек
500 мсек
------------------------
Среднее время вычислений: 500 мсек
Итог: PowerBASIC обходит логическое дерево Select Case на 50,9% быстрее чем VB.
Отрыв еще больше чем в первом случае. Это наглядно показывает, что такая архиважная
конструкция как Select Case реализована в VB очень небрежно и медленно.
Если подвести общий итог - использовать VB для сложных и длительных научных расчетов однозначно нельзя!
Т.к. он значительно проигрывает по скорости, даже такому среднему и посредственному компилятору как PB.
А о серьезной конкуренции для C++ и коммерческих компиляторах Fortan`а даже и говорить смешно...
Это не значит, что VB - плохой продукт. Просто у него другая область применения. Неправильно сравнивать кукурузник и реактивный истребитель по скорости полета.
В аттаче лежат исходники тестов.