Сообщение от
SKV
Из чего вопрос к разработчикам: почему при увеличении тактовой частоты процессора в 2 раза производительность возросла примерно в 15 раз?
Тестовый проек прикрепляю (+ собственная библиотека статистики).
У меня проект правильно открылся?
Код:
VAR
j : INT;
JMax : INT := 30000;
tmpI : INT;
tmpR : REAL;
Statistic : TimeStatistic;
END_VAR
...
FOR j := 1 TO JMax DO
tmpI := tmpI + 1;
tmpR := tmpR + 1;
END_FOR;
Вообще говоря, подобным образом сравнивать производительность это странно.
Нормальный компилятор должен поменять этот самый FOR цикл в такое (вообще выкинуть FOR):
Код:
tmpI := tmpI + JMax;
tmpR := tmpR + JMax;
А потом компилятор должен понять, что значения tmpI и tmpR вообще не используются, значит их из программы можно выкинуть, и, всё, в программе не осталось кода кроме "обращений к таймерам".
Честно говоря, не знаю насколько умный компилятор в CDS2.3, но не исключаю, что не самый глупый.
Что предлагаю сделать:
1) Сделать так, чтобы "длина цикла" читалась из какого-нибудь регистра, IO и т.п. Ну, чтобы компилятор не мог заложиться на то, что JMax всегда равно 30000
2) Выводить результирующие значения tmpI и tmpR в какие-нибудь output'ы. Тогда компилятор не сможет вообще выкинуть работу с переменными, а будет обязан как минимум записать финальный результат.
3) Если проверять именно счётные возможности (например, скорость сложения), то нужно оформлять цикл так, чтобы компилятор не мог превратить цикл в одно простое tmpI := tmpI + JMax;
Как вариант, делать WHILE цикл с чуть более сложным условием.
Как вариант, вместо кучки tmp1, tmp2, ... можно использовать массив, но у массива из 5-и элементов и у 5-и переменных может получиться совсем разная производительность (в зависимости от того, как сработает register allocation):
Код:
JMax := in_max; (* это чтение длины цикла, фактически всегда одно и то же, но компилятор об этом не будет знать *)
tmp1 := 0;
tmp2 := 0;
tmp3 := 0;
tmp4 := 0;
tmp5 := 0;
WHILE tmp1 < JMax (* возможно, стоит что-то поковарнее придумать, но тут нужно замерять и смотреть догадывается ли компилятор выкинут цикл *)
tmp1 := tmp1 + 1;
tmp2 := tmp2 + 1;
tmp3 := tmp3 + 1;
tmp4 := tmp4 + 1;
tmp5 := tmp5 + 1;
END_WHILE
out1 := tmp1;
out2 := tmp2;
out3 := tmp3;
out4 := tmp4;
out5 := tmp5;