You are here
Быстродействие вычислений
Есть число 1.0000001, и его 27 раз нужно:
- умножать само на себя
- возводить в степень 2.01
И всё это десять раз подряд, чтобы стала заметна разница во времени.
Тест предложен Сергеем Фроловым. На сайте коллег много результатов разных моделей калькуляторов.
Я решил протестировать SwissMicros DM42. Вот программа, которую, видимо, можно еще подсократить - я не являюсь опытным пользователем этой модели.
00 {92-byte prgm} 01 1.010 02 STO "P0" 03 LBL "C0" 04 1.0000001 05 STO "P1" 06 STO "P2" 07 1.027 08 STO "P3" 09 LBL "C1" 10 RCL "P1" 11 ENTER 12 x 13 STO "P1" 14 RCL "P2" 15 2.01 16 Y^X 17 STO "P2" 18 ISG "P3" 19 GTO "C1" 20 ISG "P0" 21 GTO "C0" 22 RCL "P1" 23 RCL "P2" 24 .END
Результаты (для отображения всех знаков F DISP ALL или FIX 8):
674 530,470741
4 669 419,98317
Время (среднее по ручному секундомеру, три запуска): 1,7 сек
Оптимизация 1. Прямое использование регистров вместо переменных.
00 {63-byte prgm} 01 1.010 02 STO 01 03 LBL "C0" 04 1.0000001 05 STO 02 06 STO 03 07 1.027 08 STO 04 09 LBL "C1" 10 RCL 02 11 ENTER 12 x 13 STO 02 14 RCL 03 15 2.01 16 Y^X 17 STO 03 18 ISG 04 19 GTO "C1" 20 ISG 01 21 GTO "C0" 22 RCL 02 23 RCL 03 24 .END
Время (среднее по ручному секундомеру, три запуска): 1,5 сек
Оптимизация 2. Использование числовых меток вместо символьных не дает выигрыша по времени.
Комментарии
А если использовать не
А если использовать не именные, а числовые регистры и метки, скорость не увеличивается?
Регистры
Использование числовых регистров дает небольшой выигрыш порядка 10%, но метки не влияют.
Таймер
В DM42 таймер есть? Функция TIME работает?
Для Free42 я когда-то заворачивал этот бенчмарк в цикл, чтоб посчитать время выполнения, т.к. один проход тоже выполнялся очень быстро:
Перед запуском нужно ввести кол-во проходов, в конце показывает среднее время выполнения одного прохода в секундах.