28 FreeBASIC - Время выполнения программы. Работа с таймером. Оптимизируем поиск простых чисел

F
freebs
Ни на копейку не оптимизировал прошлый раз задачу поиска простых чисел. Сейчас мы займёмся этой не лёгкой работой. И хотелось бы реально увидеть результат оптимизации - "стало быстрее в n раз" ![](https://i.imgur.com/Hon23U7.png) Но для начала нужно измерить время исполнения той программы что есть. Мы уже использовали **timer** в команде **randomize timer**. Здесь же по этому таймеру будем измерять время выполнения кода. Зафиксируем значение таймера **до** выполнения.. и **после** - разность и будет временем выполненя участка программы. Вначале проэкспериментируем немного с таймером. Измерим несколько раз время выполнения команды sleep - паузы в 1000 мс (секунда) ![](https://i.imgur.com/ccCXI9t.png) ``` dim st as double dim i as integer for i =1 to 9 st =timer() sleep 1000 print timer() - st print "---------------------" next i sleep ``` И уже есть представление о точности - далее третьего знака не лезть))) Запустил на домашнем компьютере (редактирую-дописываю пост) чуть иная картина ![](https://i.imgur.com/Or2Qse0.png) Операция деления для компьютера крепкий орешек был, во всяком лучае на первых ЭВМ,калькуляторах она в несколь раз давалась тяжелее ![](https://i.imgur.com/vmjsIji.png) ``` dim as double st, a dim as integer i, j a=99999999 for i =1 to 9 st =timer() for j=1 to 100000:a=a/3:next j print timer() - st print "---------------------" next i sleep ``` Ну и быстродействие..в пресчёте на секунду - 100 млн операций деления. И точность четыре знака после запятой. ![](https://i.imgur.com/VfdS64e.png) Производительность дома - почти в два раза быстрее... ## Возвращаемся к простым числам Измерим время нахождения хх чисел - в двух вариантах: с выводом на экран и без него. Вот код из прошлого примера ''' dim as integer f dim as longint i, k for k=2 to 1000 f=0 for i=2 to k-1 if k mod i = 0 then f=1 next i if f=0 then print k; next k sleep ''' добавляем ''' ... dim as double st st=timer() ... st=st-timer() print print st sleep ''' | |с выводом |без вывода | |---|:-:|---| |без оптимизации| 46.26 | 43.83 | |если нашли делитель - exit for| 6.91 | 3.95 | |sqr(k)| 2.24 | 0.028 | Вывод занимает чуть более 2 секунд, и не зависит от оптимизаций - логично ведь на вывод идёт одинаковое количество чисел. А время расчётов уменьшилось в 20 раз. Поиск простых чисел до миллиона занимает чуть больше чем половина секунды)))

Comments