Вопросы оптимизации - (почему так "медленно"?)

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Вопросы оптимизации - (почему так "медленно"?)

Сообщение Kitayets » 06.05.2015 17:22:38

еще раз привет всем.

на досуге решил тут порешать задачки по программированию. есть сайт с задачами (архив задач олимпиадных и тестер) - сам сайт 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?
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

Re: Вопросы оптимизации - (почему так "медленно"?)

Сообщение скалогрыз » 06.05.2015 20:56:16

есть мнение, что разница во времени связана с readln / writeln.

правильным сравнением времени будет - сравнение только опреации(й) умножения :)

Но тогда вопрос будет не в оптимизации, а в rtl функциях FPC vs C. Ну и при желании "медленные" readln / writeln заменить своими.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Вопросы оптимизации - (почему так "медленно"?)

Сообщение wavebvg » 07.05.2015 03:48:21

Код: Выделить всё
/usr/bin/time -v ./hello
798267360
   Command being timed: "./hello"
   User time (seconds): 0.00
   System time (seconds): 0.00
   Percent of CPU this job got: 100%
   Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
   Average shared text size (kbytes): 0
   Average unshared data size (kbytes): 0
   Average stack size (kbytes): 0
   Average total size (kbytes): 0
   Maximum resident set size (kbytes): 1312
   Average resident set size (kbytes): 0
   Major (requiring I/O) page faults: 0
   Minor (reclaiming a frame) page faults: 63
   Voluntary context switches: 1
   Involuntary context switches: 3
   Swaps: 0
   File system inputs: 0
   File system outputs: 0
   Socket messages sent: 0
   Socket messages received: 0
   Signals delivered: 0
   Page size (bytes): 4096
   Exit status: 0


От чисел в аргументах не зависит
RTL выкинут

LINUX X64
wavebvg
постоялец
 
Сообщения: 355
Зарегистрирован: 28.02.2008 04:57:35

Re: Вопросы оптимизации - (почему так "медленно"?)

Сообщение Kitayets » 08.05.2015 00:35:12

wavebvg ммм, а код то где сам?
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

Re: Вопросы оптимизации - (почему так "медленно"?)

Сообщение wavebvg » 08.05.2015 11:49:24

wavebvg
постоялец
 
Сообщения: 355
Зарегистрирован: 28.02.2008 04:57:35

Re: Вопросы оптимизации - (почему так "медленно"?)

Сообщение Дож » 08.05.2015 12:52:25

Раз уж на то пошло, то у меня и исходная программа выдаёт 0.00 в LINUX X64:
Код: Выделить всё
[doj@larion ~/temp]$ fpc task_1293_acm.pas && echo 1 2 3 | /usr/bin/time -v ./task_1293_acm
/usr/bin/ld: warning: link.res contains output sections; did you forget -T?
12
        Command being timed: "./task_1293_acm"
        User time (seconds): 0.00
        System time (seconds): 0.00
        Percent of CPU this job got: ?%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
        Average shared text size (kbytes): 0
        Average unshared data size (kbytes): 0
        Average stack size (kbytes): 0
        Average total size (kbytes): 0
        Maximum resident set size (kbytes): 124
        Average resident set size (kbytes): 0
        Major (requiring I/O) page faults: 0
        Minor (reclaiming a frame) page faults: 59
        Voluntary context switches: 1
        Involuntary context switches: 3
        Swaps: 0
        File system inputs: 0
        File system outputs: 0
        Socket messages sent: 0
        Socket messages received: 0
        Signals delivered: 0
        Page size (bytes): 4096
        Exit status: 0
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Вопросы оптимизации - (почему так "медленно"?)

Сообщение Kitayets » 08.05.2015 14:18:04

wavebvg линковаться к libc для ввода/вывода? на 99% на тестовой машине win32 и сишной библиотеки там может и не быть запросто. тогда уж линкваться к kernel32.dll или где там системные функции ввода/вывода в винде лежат?

Добавлено спустя 31 минуту 27 секунд:
ну и там ограничение - вся программа должна быть 1 файлом, причем текст постится в форму с ограничением на длину текста программы в 64 кб.

как в таких условиях подменить System не совсем понятно. При этом кому-то это удается.
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

Re: Вопросы оптимизации - (почему так "медленно"?)

Сообщение wavebvg » 08.05.2015 16:12:43

Kitayets
Тогда просто не используйте функции RTL - запуск будет чуть дольше (в бинарник залинкуется, но на статистику сисльно влияет только при первом запуске), ввод/вывод осуществляйте в зависимости от системы, где запущена программа.

Раньше было принято использовать Output|Input файлы - так было проще и понятнее.

Дож
Судя по результатам - это потому что новые Intel-кие процессоры с энергосбережением странно всё это дело выполняют. У меня на ноуте (не самом быстром, "походном") всё тоже по нулям.
wavebvg
постоялец
 
Сообщения: 355
Зарегистрирован: 28.02.2008 04:57:35

Re: Вопросы оптимизации - (почему так "медленно"?)

Сообщение Kitayets » 08.05.2015 17:33:11

У меня на ноуте (не самом быстром, "походном") всё тоже по нулям.


ну судя по всему там не 1 тест - и время указывается общее за все тесты.

для чистоты эксперимента надо, чтобы оценить преложенную оптимизацию можно было бы сделать так:
1. подобрать кол-во тестов так, чтобы общее время их выполнения (только процессорное время) было измеримо (до 0,5 сек) в обычном варианте
2. запустить те же тесты на оптимизированном варианте
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru
cron