Как ускорить вычислительные процессы программы? - QBasic
Формулировка задачи:
Чтобы сделать быструю программу, в которой много вычислений,
Надо по возможности не делать эти вычисления в самой
программе, а вставить в программу уже готовые значения.
Вот яркий пример:
Требуется вычислить sin1° + sin2° + ... + sin90°
Чтобы определить затраченное время, в программе эти вычисления
повторяются 100 000 раз.
Для сравнения смотрите вторую программу, которая делает тоже
самое, но все синусы вычислены заранее
Программа 2 (соперник)
Время выполнения первой программы = 85 сек
Время выполнения второй программы = 55 сек
Как видите вторая программа выполняется
быстрее первой в 1,5 раза
Желая узнать какого эффекта можно достигнуть
если взять функцию чуть сложнее, не меняя самой
программы, я использовал следующую функцию:
SIN(i / 180 * 3.141592) + LOG(i) - LOG(i)
(по сути та же задача, логарифмы в нагрузку)
Время вычисления составило 169 сек - в ТРОЕ (!!)
больше, чем у программы (55 сек), где все сосчитано.
Пусть каждый сделает для себя вывод ....
Успехов всем!
Листинг программы
- DEFSNG S, X
- DEFLNG I, N
- CLS
- FOR n = 1 TO 100000
- s = 0
- FOR i = 1 TO 90
- s = s + SIN(i / 180 * 3.141592)
- NEXT i
- NEXT n
- PRINT s
- END
Листинг программы
- DEFSNG S, X
- DEFLNG I, N
- CLS
- DATA .0174524 , 3.489949E-02 , 5.233594E-02 , 6.975646E-02
- DATA 8.715572E-02 , .1045284 , .1218693 , .1391731 , .1564344
- DATA .1736481 , .190809 , .2079117 , .224951 , .2419218 , .258819
- DATA .2756373 , .2923717 , .3090169 , .3255681 , .3420201 , .3583679
- DATA .3746065 , .3907311 , .4067366 , .4226182 , .4383711 , .4539904
- DATA .4694715 , .4848095 , .4999999 , .515038 , .5299191 , .5446389
- DATA .5591928 , .5735763 , .5877851 , .6018149 , .6156614 , .6293203
- DATA .6427875 , .6560589 , .6691305 , .6819983 , .6946583 , .7071066
- DATA .7193397 , .7313536 , .7431447 , .7547095 , .7660443 , .7771459
- DATA .7880107 , .7986354 , .8090169 , .8191519 , .8290375 , .8386704
- DATA .848048 , .8571672 , .8660253 , .8746196 , .8829475 , .8910064
- DATA .8987939 , .9063077 , .9135454 , .9205047 , .9271837 , .9335803
- DATA .9396926 , .9455185 , .9510564 , .9563047 , .9612616 , .9659258
- DATA .9702957 , .97437 , .9781476 , .9816271 , .9848077 , .9876883
- DATA .9902681 , .9925461 , .9945219 , .9961947 , .997564 , .9986295
- DATA .9993908 , .9998477 , 1
- FOR n = 1 TO 10000
- s = 0
- FOR i = 1 TO 90
- READ x
- s = s + x
- NEXT i
- RESTORE
- NEXT n
- PRINT s
- END
Решение задачи: «Как ускорить вычислительные процессы программы?»
textual
Листинг программы
- DEFSNG S, X
- DEFLNG I, N
- CLS
- DIM sn(1 TO 90)
- FOR i = 1 TO 90
- sn(i) = SIN(i / 180 * 3.141593)
- NEXT i
- FOR n = 1 TO 100000
- s = 0
- FOR i = 1 TO 90
- s = s + SN(i)
- NEXT i
- NEXT n
- PRINT s
- END
Объяснение кода листинга программы
В этом коде на языке QBasic выполняется следующее:
- Установка значений переменных:
- Установка константы
S
(вероятно, это значение не меняется в ходе выполнения программы). - Установка константы
X
(вероятно, это значение не меняется в ходе выполнения программы). - Установка счётчика
I
для цикла. - Установка счётчика
N
для цикла.
- Установка константы
- Инициализация массива:
- Объявление массива
sn(1 TO 90)
(возможно, это массив для хранения результатов вычислений). - Заполнение массива
sn
значениями синуса от 0 до 90 градусов с шагом 1 градус (предполагается, что функцияSIN
доступна и возвращает значение синуса).
- Объявление массива
- Вычисление суммы:
- Установка начального значения переменной
s
равным 0. - Цикл по индексам массива
sn
. - Приращение значения переменной
s
на значение элемента массиваsn(i)
.
- Установка начального значения переменной
- Повторение вычислений:
- Цикл, выполняющийся 100 000 раз (возможно, это нужно для получения более точного результата).
- Внутри цикла - повторение вычисления суммы.
- Вывод результата:
- Вывод значения переменной
s
(вероятно, это сумма синусов).
- Вывод значения переменной
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д