Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
sergiy
6 лет назад

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

Ни на копейку не оптимизировал прошлый раз задачу поиска простых чисел. Сейчас мы займёмся этой не лёгкой работой. И хотелось бы реально увидеть результат оптимизации - "стало быстрее в n раз"

Но для начала нужно измерить время исполнения той программы что есть.

Мы уже использовали timer в команде randomize timer. Здесь же по этому таймеру будем измерять время выполнения кода.
Зафиксируем значение таймера до выполнения.. и после - разность и будет временем выполненя участка программы.

Вначале проэкспериментируем немного с таймером.

Измерим несколько раз время выполнения команды sleep - паузы в 1000 мс (секунда)

dim st as double
dim i as integer

for i =1 to 9
    st =timer()
    sleep 1000
    print timer() - st
    print "---------------------"
next i
sleep

И уже есть представление о точности - далее третьего знака не лезть)))
Запустил на домашнем компьютере (редактирую-дописываю пост) чуть иная картина

Операция деления для компьютера крепкий орешек был, во всяком лучае на первых ЭВМ,калькуляторах она в несколь раз давалась тяжелее

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 млн операций деления. И точность четыре знака после запятой.


Производительность дома - почти в два раза быстрее...

Возвращаемся к простым числам

Измерим время нахождения хх чисел - в двух вариантах: с выводом на экран и без него.

Вот код из прошлого примера

'''
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.2643.83
если нашли делитель - exit for6.913.95
sqr(k)2.240.028

Вывод занимает чуть более 2 секунд, и не зависит от оптимизаций - логично ведь на вывод идёт одинаковое количество чисел.
А время расчётов уменьшилось в 20 раз.

Поиск простых чисел до миллиона занимает чуть больше чем половина секунды)))

6
458.692 GOLOS
На Golos с October 2016
Комментарии (4)
Сортировать по:
Сначала старые