Форум программистов, компьютерный форум, киберфорум
QBasic
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Заблокирован
1

Как ускорить вычислительные процессы программы?

21.04.2014, 18:19. Показов 1083. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Чтобы сделать быструю программу, в которой много вычислений,
Надо по возможности не делать эти вычисления в самой
программе, а вставить в программу уже готовые значения.
Вот яркий пример:
Требуется вычислить sin1° + sin2° + ... + sin90°
Чтобы определить затраченное время, в программе эти вычисления
повторяются 100 000 раз.
Для сравнения смотрите вторую программу, которая делает тоже
самое, но все синусы вычислены заранее
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
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
Программа 2 (соперник)

QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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
Время выполнения первой программы = 85 сек
Время выполнения второй программы = 55 сек
Как видите вторая программа выполняется
быстрее первой в 1,5 раза
Желая узнать какого эффекта можно достигнуть
если взять функцию чуть сложнее, не меняя самой
программы, я использовал следующую функцию:
SIN(i / 180 * 3.141592) + LOG(i) - LOG(i)
(по сути та же задача, логарифмы в нагрузку)
Время вычисления составило 169 сек - в ТРОЕ (!!)
больше, чем у программы (55 сек), где все сосчитано.
Пусть каждый сделает для себя вывод ....
Успехов всем!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.04.2014, 18:19
Ответы с готовыми решениями:

Разветвляющиеся вычислительные процессы
№1. Разветвляющиеся вычислительные процессы. Определить, состоит ли введенное 2-значное...

Разветвляющиеся вычислительные процессы. Оператор выбора.
Составить программу для решения задачи, используя оператор выбора. Предусмотреть проверку данных на...

Циклические вычислительные процессы. Вычислить первые 20 членов
дано вычислить первые 20 членов \cos x=1-{x}^{2}/2+{x}^{4}/4-{x}^{6}/6+.....+{x}^{2n+1}*z/2n

Итерационные вычислительные процессы. Вычислить произведение членов ряда
Вычислить произведение членов ряда при x=1.82+\cos n P=x/2!*x/4!*x/6!*....

7
Заблокирован
22.04.2014, 09:07 2
Лучший ответ Сообщение было отмечено gehh как решение

Решение

Программа 3 (ещё соперник)
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
И сколько сек тут?

Добавлено через 12 часов 3 минуты
Цитата Сообщение от gehh Посмотреть сообщение
FOR n = 1 TO 100000
и
Цитата Сообщение от gehh Посмотреть сообщение
FOR n = 1 TO 10000
Это опечатка? Или так и задумано?
1
Заблокирован
22.04.2014, 09:19  [ТС] 3
Фантастика!!
Ваша программа проработала 11 (!!!) сек
В 5 раз быстрее!!
Никогда не думал, что массивы столь быстры!
Да, моя программа вашей не соперник!
Огромное вам СПАСИБО !!

P.S. Нет никакой опечатки.
0
Заблокирован
22.04.2014, 09:27 4
Цитата Сообщение от gehh Посмотреть сообщение
Нет никакой опечатки.
Почему в первой 100 000, а во второй - 10 000?
1
Заблокирован
22.04.2014, 09:36  [ТС] 5
Вы правы. Это опечатка.
Но откуда она взялась??
Я копировал всю программу целиком.
Спасибо вам!
0
5001 / 1673 / 409
Регистрация: 25.04.2010
Сообщений: 4,623
Записей в блоге: 2
22.04.2014, 12:14 6
Лучший ответ Сообщение было отмечено gehh как решение

Решение

Цитата Сообщение от gehh Посмотреть сообщение
Чтобы сделать быструю программу, в которой много вычислений
На дряхлом QBasic-е, быструю прогу вы не напишете. Про табличные вычисления не знает
лишь тот, кто не оптимизировал свои программы и проще этого нет ничего. И это конечно
же не панацея, данный метод не везде применим, он нещадно жрёт память для крупных
таблиц. DATA конечно работает медленнее массивов, т.к. это комплексный оператор он
хавает и числа и строки, да и реализация его в QBasic\QB корявая. В DATA лучше забивать
данные в виде HEX строк и раскладывать в массив уже в программе.
1
Заблокирован
22.04.2014, 13:28  [ТС] 7
Вы правы. Но я подразумевал в данной программе не только QBasic.
По сути это общий принцип: Вычисли то, на что в программе уходит
Масса времени. А потом это можно либо в программу вставить, либо
в текстовый файл. И далее, как тут хорошо подсказали, можно загрузить
в массив. Конечно общий объём программы увеличивается. Но здесь
никуда не денешься. Хочешь быстро - не жалей память. Быстродействие
программы и ее объём - вещи несовместимые!! Спасибо вам за информацию!
Как говорится, с миру по нитке - голому рубаха. Спасибо!
0
572 / 141 / 37
Регистрация: 12.03.2012
Сообщений: 403
22.04.2014, 13:32 8
Не надо забывать про настройки опций компилятора bc.exe, правда я лично, использую всего две опции:
/O - генерирует объектный код для автономных исполняемых программ
(stand-alone EXE-files).
/Ot - позволяет оптимизировать, а во многих случаях и ускорить,
выполнение процедур SUB и функций FUNCTION.
Это, в чем я сам убедился, дает максимальную скорость исполняемых программ.
1
22.04.2014, 13:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.04.2014, 13:32
Помогаю со студенческими работами здесь

Разветвляющиеся вычислительные процессы
На координатной плоскости задана своими координатами точка А. Указать, где она расположена (на...

Линейные вычислительные процессы.
Пожалуйста, помогите решить задачку в делфи! Селикционер вывел новый сорт зерновой культуры и...

Циклические вычислительные процессы
Помогите пожалуйста, не могу разобраться совсем в этой теме, осталась одна неделя, зачет очень...

Разветвляющиеся вычислительные процессы в С++
Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в...

Циклические вычислительные процессы
Дан массив М содержащий 15 элементов вещественного типа. Найти максимальный элемент и вычислить...

Циклические вычислительные процессы
помогите пожалуйста,новичок в Паскале 1. Вычислить значения функции F(x) на отрезке c шагом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru