@doves
далек от программирования, но хочу стать ближе)

Можно ли оптимизировать код по скорости?

Буду признателен за идеи, как можно ускорить этот код. Код работает правильно, но довольно медленно. Может быть, как-то можно уйти от вложенных циклов или еще что-то? Заранее спасибо!

ReDim ABCDE (1 To MatrixRows, 1 To 17^5*5) As Integer
    For a = -2.4 To 2.4 Step 0.3
        For b = -2.4 To 2.4 Step 0.3
            For c = -2.4 To 2.4 Step 0.3
                For d = -2.4 To 2.4 Step 0.3
                    For e = -2.4 To 2.4 Step 0.3
                           VAR = VAR + 1
                           VAR5 = VAR*5 - 5
                        For LOOP_CASE = 1 To MatrixRows  
                           
ABCDE (LOOP_CASE, 1+VAR5)=Round(7+3*(HR_PRED(LOOP_CASE, 73)+c)+2*(HR_PRED(LOOP_CASE, 72)+b)-1.4*(HR_PRED(LOOP_CASE, 74)+d)-3*(HR_PRED(LOOP_CASE, 71)+a)-3.*(HR_PRED(LOOP_CASE, 75)+e),0)
ABCDE (LOOP_CASE, 2+VAR5)=Round(5+2*(HR_PRED(LOOP_CASE, 71)+a)+0.5*(HR_PRED(LOOP_CASE, 74)+d)-0.05*(HR_PRED(LOOP_CASE, 72)+b)-0.4*(HR_PRED(LOOP_CASE, 73)+c)-0.3*(HR_PRED(LOOP_CASE, 75)+e),0)
ABCDE (LOOP_CASE, 3+VAR5)=Round(2*(HR_PRED(LOOP_CASE, 75)+e)+2*(HR_PRED(LOOP_CASE, 71)+a)+1.18*(HR_PRED(LOOP_CASE, 74)+d)-6*(HR_PRED(LOOP_CASE, 72)+b)-2.5*(HR_PRED(LOOP_CASE, 73)+c),0)
ABCDE (LOOP_CASE, 4+VAR5)=Round(1.7*(HR_PRED(LOOP_CASE, 73)+c)+1.13*(HR_PRED(LOOP_CASE, 75)+e)+0.17*(HR_PRED(LOOP_CASE, 72)+b)-0.5*(HR_PRED(LOOP_CASE, 74)+d)-1.15*(HR_PRED(LOOP_CASE, 71)+a),0)
ABCDE (LOOP_CASE, 5+VAR5)=Round(72+3*(HR_PRED(LOOP_CASE, 73)+c)+1.2*(HR_PRED(LOOP_CASE, 74)+d)-0.2*(HR_PRED(LOOP_CASE, 72)+b)-2.8*(HR_PRED(LOOP_CASE, 71)+a)-3*(HR_PRED(LOOP_CASE, 75)+e),0)

                           Next LOOP_CASE
                      Next e
                 Next d
            Next c
       Next b
 Next a
  • Вопрос задан
  • 243 просмотра
Решения вопроса 2
15432
@15432
Системный программист ^_^
Из очевидного - участки вида HR_PRED(LOOP_CASE, 73) используются в самой глубине ваших циклов и, возможно, пересчитываются на каждой итерации.

Можно в самом начале до циклов посчитать все возможные значения для 1...MatrixRows и аргументов 71-75 в табличку размерности MatrixRows * 5 , а в формулах брать готовые значения из этой таблицы.

И вообще, что такое HR_PRED ? может получится чуток свернуть формулы?

Ещё из предложений - значения a/b/c/d/e в циклах заменить на целочисленные (-8...8, step 1), а в самой формуле поменять коэффициенты умножения соответствующим образом (HR_PRED тоже чуть иначе считать потребуется).

Также заметил, что второй аргумент HR_PRED влияет на то, с чем будет складываться. Тогда можно еще больше упростить, предварительно вычислив пять значений HR_PRED(LOOP_CASE, 71)+a, ...72+b ...73+c, и уже их подставлять в формулы на следующем шаге
Ответ написан
akzhan
@akzhan
// сперва посчитаем HR_PREDs71
ReDim HR_PREDs71 (1 To MatrixRows) As Float
For LOOP_CASE = 1 To MatrixRows  
    HR_PREDs71(LOOP_CASE) = HR_PRED(LOOP_CASE, 71)
Next LOOP_CASE


Далее понятно?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@sitev_ru
sitev.ru - мой блог ...
А если поменять язык программирования? Выбрать из С++/C#/Java, точно быстрее будет!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы