на досуге решил тут порешать задачки по программированию. есть сайт с задачами (архив задач олимпиадных и тестер) - сам сайт http://acm.timus.ru, но это не важно. там принимают решения на дюжине языков в том числе и на freepascal - и компилятор довольно свежий 2.6.4 (32 бит)
вопрос такой, есть ряд задач низкой сложности в которых решение сводится к простым арифметическим операциям, например задача 1293 сводится к тому, что на входе 3 числа (целые, положительные в диапазоне 1..100) их нужно умножить и полученный результат умножить на 2
лучшее мое решение это:
- Код: Выделить всё
program task_1293_acm;
{$mode objfpc}{$H+} //комментирование этих строк не изменяет результат
{$IOCHECKS OFF}
{$OPTIMIZATION REGVAR,LEVEL3}
var
a, b, c: integer;
begin
read(a, b, c);
writeln(2*a*b*c);
end.
тестер говорит что все тесты выполнились за 0.015 использовано памяти 90 кб,
но если смотреть лучшие результаты, то там скорость выполнения на порядок меньше (хотя памяти использовано больше), даже решения на freepascal (хотя лучшие результаты на версии fpc 2.0).
вопрос - как? ходя по местному форуму видел там решения на С - где умножения заменены на поразрядные операции и сложения, но это ли путь к ускорению? ведь в ассемблерном выводе ничего лишнего, умножение на 2 заменяется сдвигом, остальные умножения - это 1 инструкция процессора imul все переменные нормально ложатся в регистры, не уж то можно получить 10-кратное ускорения заменив 3 imul на портянку из поразрядных операций и сложений???
или все дело в встроенных функций ввода/вывода и они являются главным тормозом?
кстати лучшие решения по памяти - около 18кб, можно ли достичь такого с использованием fpc?