powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Скорость арифметики с number
38 сообщений из 38, показаны все 2 страниц
Скорость арифметики с number
    #40007464
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Этот новый для меня тип number (переменная длина, десятичный формат, отсутствие аппаратной поддержки) поначалу вызвал настороженность.

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

Сравнение нормализованных number можно сделать довольно эффективно, насчёт других операций не уверен.

Предполагаю, что даже если арифметика с number происходит на порядок медленнее, это вряд ли влияет на общую картину, т.к. оракле - это не платформа для численных методов, а самые ходовые функции встроены и наверное оптимизированы.

Чтобы отмахнуться от этой мысли медленной арифметики раз и навсегда, собираюсь сделать несколько замеров численных методов в компилированом pl/sql для number против других поддерживаемых форматов. Если только на порядок медленнее, можно жить.

Надеюсь что кто-то это уже делал до меня, поиск по форуму пока ничего не нашел.
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007478
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL,

Чистые арифметические операции с Number медленнее примерно на порядок по сравнению с машинными типами данных, если операции смешанные, то в большинстве реальных кейсов разница не имеет особого значения.

Ask Tom: PLS_INTEGER versus NUMBER versus "dynamic types"
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007483
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
graycode,


Спасибо. Это как раз те заключения, на которые я надеялся.
Медленнее чем оптимально, но на картину в целом не влияет.

Поскольку таблицы не умеют хранить pls_integer (в 11.2,) небрежное его использование может привести и к замедлению, из-за необходимых преобразований.

Эксперимент Тома для number/pls_integer довольно исчерпывающий, я сделаю сравнение для number/IEEE.
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007518
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

вопрос про "скорость арифметики с number" по степени нелепости примерно эквивалентен вопросу "что быстрее sql или c++".

В обоих случаях это ... кхм... скажем округло - вопрос такого человека, который, скорее всего,
не сможет разумно обойтись ни с каким ответом, по причине не способности понять смысла полученных ответов.

Применительно к числам, правильно было бы сначала сформулировать набор необходимых вам требований к вычислительному базису, реализованному в системе для таких или иных чисел.

Вот поставите вы "эксперименты" и они покажут, что binary_double, допустим,
на пару порядков быстрее number на каком-то наборе операций.
Что вы с этой скоростью делать собираетесь, если ваших заказчиков
перестанет устраивать результат, возвращаемый агрегатным Sum?
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007523
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,


Попробую ответить.

авторЧтобы отмахнуться от этой мысли медленной арифметики раз и навсегда, собираюсь сделать несколько замеров численных методов в компилированом pl/sql для number против других поддерживаемых форматов. Если только на порядок медленнее, можно жить.

Вас интересовало, что я собираюсь делать, если некоторые операции значительно (в сотни-тысячи раз) быстрее для IEEE чисел.

В этом случае я собираюсь изучить вопрос более подробно, посмотреть в каких ситуациях может произойти нежелательное неявное преобразование, и как этого могут избежать те, кому важна скорость арифметики в pl/sql.

>если ваших заказчиков перестанет устраивать результат, возвращаемый агрегатным Sum?

Хороший, кстати use case - сравнить скорости агрегатных функций на колонках разных типов. Спасибо.
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007524
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
...
Хороший, кстати use case - сравнить скорости агрегатных функций на колонках разных типов. Спасибо.


В общем-то, чтд.

Количество вреда, которое вы на текущий момент способны принести своим работодателям,
если они у вас на самом деле есть, непредсказуемо велико.
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007526
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby
НеофитSQL
...
Хороший, кстати use case - сравнить скорости агрегатных функций на колонках разных типов. Спасибо.


В общем-то, чтд.

Количество вреда, которое вы на текущий момент способны принести своим работодателям,
если они у вас на самом деле есть, непредсказуемо велико.


Это справедливое замечание для любого человека с админ доступом к серверу.

Однако, это не объясняет почему мой интерес к этому вопросу вас раздражает. Он к моей работе не относится, я расширяю свой кругозор где мне интересно.

Ещё бы хотелось узнать, когда и кем был изобретён формат number. Какие цели преследовались (одну я знаю, избежать ошибок округления двоичной арифметики) , и какие альтернативы рассматривались.
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007529
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL

Это справедливое замечание для любого человека с админ доступом к серверу.

между результатом обращения с гранатой обезьяны и обученного бойца есть существенная разница

Однако, это не объясняет почему мой интерес к этому вопросу вас раздражает. Он к моей работе не относится, я расширяю свой кругозор где мне интересно.

Не раздражает.
Очень хорошо, что не относится к работе.
Кругозор вы расширяете методом случайного тыка.
И каждый раз обнаруживается, что вам не на что опереться,
в тех вопросах, которые внезапно показались вам "интересными".

Ещё бы хотелось узнать, когда и кем был изобретён формат number. Какие цели преследовались (одну я знаю, избежать ошибок округления двоичной арифметики) , и какие альтернативы рассматривались.

Конкретной истории вопроса применительно к реализации в Oracle я не знаю.

По сути это разновидность того, что сейчас называют BCD-кодированием,
различные варианты которого реализовывались как в железе, годов до 80х прошлого века, так и в языках программирования сорта COBOL или PL/I

В данном случае, используется представление переменной длины.
Которое, вообще говоря, не избегает "ошибок округления двоичной арифметики", что бы вы под этим ни подразумевали
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007530
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,


Ошибка округления двоичной арифметики, это когда например округление 0.1*5 до целого числа даёт 0 в двоичной системе, а по правилам округления должно давать 1. Простой пример, легко запомнить.

Это довольно полезно для финансовых задач.
Недавно как раз приходил на форум человек с похожим вопросом, тоже не знал.
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007531
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

вот недавний совсем топик, посмотрите, может быть будет "интересно".

https://www.sql.ru/forum/1315510-1/peremena-mesto-mnozhitelya-v-vyrazhenii-imeet-znachenie
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007533
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
округление 0.1*5 до целого числа даёт 0 в двоичной системе, а по правилам округления должно давать 1.
Это довольно полезно для финансовых задач.

Есть разные правила округления.
Если уж упомянуты финансовые задачи, то тут применяют округление до ближайшего чётного . Для приведённого примера оно даёт как раз 0, а не 1.
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007535
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Правильный Вася
НеофитSQL
округление 0.1*5 до целого числа даёт 0 в двоичной системе, а по правилам округления должно давать 1.
Это довольно полезно для финансовых задач.

Есть разные правила округления.
Если уж упомянуты финансовые задачи, то тут применяют округление до ближайшего чётного . Для приведённого примера оно даёт как раз 0, а не 1.


Round(0.1*15)=?

Я думаю мы оба понимаем о чем речь. Или теперь надо до нечётного округлять? :)
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007536
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Или теперь надо до нечётного округлять?

Правила округления.
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007537
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby
НеофитSQL,

вот недавний совсем топик, посмотрите, может быть будет "интересно".

https://www.sql.ru/forum/1315510-1/peremena-mesto-mnozhitelya-v-vyrazhenii-imeet-znachenie


Это слишком просто, на уровне 1/3*3.
Человек поигравшийся с калькулятором понимает откуда ошибка
Для 1/10*10 это неочевидно для непрограммистов.
Одно из преимуществ BCD - они себя ведут как те десятичные числа, которые учат в школе.

Второе преимущество - их легче и быстрее распечатать в десятичном формате, самом популярном. Слабенький, но козырь.
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007538
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Правильный Вася
НеофитSQL
Или теперь надо до нечётного округлять?

Правила округления.


Хорошее упорство :)

Round(1.5) -Round(15*0.1)=?
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007539
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Хорошее упорство

Кто б говорил.
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007540
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

Вы не поняли ни того, что вам сказал Правильный_Вася, ни того, о чём шла речь в топике по ссылке.
...
Остается надеяться только на то, что "для работы",
результаты полученных измерений Number вам не скоро пригодятся...

PS
Oracle, кстати, не использует округление half to even, это специфически именно имени компании Microsoft представление о том, каким должно быть "банковское округление".
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007542
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby

Oracle, кстати, не использует округление half to even, это Microsoft представление о том, каким должно быть "банковское округление".

Не совсем так. Понятие гораздо старше Майкрософта.
И в Оракле есть специальное округление
Код: plsql
1.
SELECT ROUND_TIES_TO_EVEN (0.5), ROUND_TIES_TO_EVEN (1.5) FROM dual;
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007545
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильный Вася,
еще не у всех есть, но появилось в 18й версии.

Что до термина, происхождение его темно и неведомо

Стандарт IEEE 754-1985 термина banker's rounding предпочитает не использовать, а толкует
о rounding to nearest, излагая по сути half to even rounding и предполагает, что это рекомендованный метод по умолчанию.
У Microsoft, в VB/VBA, например, (по крайней мере, после 85 года) оно такое и есть,
но в документации названо "банковским".

Так что за распространение именно этого термина в технической литературе вся заслуга у MS.
Вообще-то его еще называют голландским, Гауссовым, немецким, статистическим и сходящимся.
https://en.wikipedia.org/wiki/Rounding#Round_half_to_even
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007548
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выходной закончился, давайте не распыляться от темы.
А то скоро начнутся религиозные бои за округления..

Если у кого-то остались сомнения, что у BCD чисел есть преимущество более привычной арифметики (и округления) чем у двоичных, пусть так и будет.

Лошадь можно привести к воде, но нельзя заставить ее пить.(с)

Завтра напишу результаты первых замеров по сравнительной скорости number и IEEE чисел для разных операций. Думаю, что IEEE будут быстрее. Надеюсь, что не в сотни раз.

Принимаю ставки, кто ближе угадает?
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007549
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
напишу результаты первых замеров по сравнительной скорости

Не забудь учесть платформу (ОС), на которой ты будешь это делать. Потому как внутренняя реализация вычислений может использовать платформенно-зависимый код, который, в свою очередь, может использовать разные возможности процессора, который тоже может быть разным. Не говорю уже о "посторонней" загрузке системы в разные моменты тестирования.

Иными словами, твои замеры не имеют никакого значения ни для кого, кроме тебя, и ни в какой момент времени, кроме момента измерения. Или у тебя 100500 тестовых платформ в 100500 разных условиях? Ну, тогда тебе не в программеры и не в админы идти. Открывай контору, бери подряды на тестирование у корпораций.
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007554
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

Невероятно, чтобы ты провел тесты, измеряющие скорость собственно математики, корректно.

Если проведешь корректно - на сложениях будут разы, на умножениях - десятки,
на модулях-синусах-логарифмах - десятки тысяч и более, при корректном устройстве теста.

И во всем этом нет смысла, если ты не знаешь, что тебе надо от математики.
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007582
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL

Завтра напишу результаты первых замеров по сравнительной скорости number и IEEE чисел для разных операций. Думаю, что IEEE будут быстрее. Надеюсь, что не в сотни раз.

тестируйте с точностью до 38-знаков

зы
насчет формата
гляньте IBM "зонный" формат
оракле могое "упростив скопировал для совместимости" с DB 2
ходили слухи что даж коды ошибок хотели совместить

.....
stax
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007698
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby

Если проведешь корректно - на сложениях будут разы, на умножениях - десятки,
на модулях-синусах-логарифмах - десятки тысяч и более, при корректном устройстве теста.
.


Интересное мнение. Десятки тысяч? Я бы ожидал, что при наличии недорого каста в/из BCD, и присутствии аппаратной поддержки для 64-бмтнй мантиссы, все "сложные" операции просто сделают через каст в IEEE, FPU, и каст обратно.

Другими словами, максимальная разница не должна превышать стоимости двух BCD/IEEE преобразований, и по-моему даже для таких преобразований есть аппаратная поддержка у интела/АМД.
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007709
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде как микропроцессоры BCD не умеют, это EC-ки умели
Да и к BCD NUMBER имеет мало отношения, просто похож

И выбрана такая система хранения была, КМК, для удобства сравнения (сравнивается как строка) + точность + независимость от Endian
Ну и тоже слышал, что калька/подобие с IBM DB2
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007720
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров,

Не совсем IBM, но вроде что-то есть (из первых ссылок гугля)

https://studfile.net/preview/3623303/page:2/

Код: plaintext
1.
2.
3.
4.
5.
В АСК современных микропроцессоров имеются команды, оперирующие целыми числами, 
представленными в упакованном виде. Связано это с обработкой мультимедийной информации.
 Формат предполагает упаковку в пределах достаточно длинного слова (обычно 64-разрядного)
 нескольких небольших целых чисел, а со­ответствующие команды обрабатывают все эти числа параллельно.
...

ps
насколько современных хз

.....
stax
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007721
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL
Ещё бы хотелось узнать, когда и кем был изобретён формат number. Какие цели преследовались (одну я знаю, избежать ошибок округления двоичной арифметики) , и какие альтернативы рассматривались.

Основная цель - независимость от платформы, т.е. результат арифметических операций должен быть одинаковым на любой платформе на которой может быть запущен сервер Oracle. Вторая основная цель - поскольку в основном в СУБД хранятся данные сопровождающие человеческую деятельность, а человеки пользуются десятичной системой счисления, то и числа должны быть представлены в десятичной системе счисления. Ошибки округления и невозможность точного представления десятичной дроби в двоичной системе счисления это совершенно разные вещи.
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007730
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxнасколько современных хз

Абсолютно всех современных. Векторная арифметика позволяет одновременно произвести
операцию над 4-8 8-16-32-х разрядными целыми числами. Но ни к BCD, ни к NUMBER это не
имеет никакого отношения и используется для мультимедии.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007739
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
Код: plaintext
1.
В АСК современных микропроцессоров имеются команды, оперирующие целыми числами, 
представленными в упакованном виде. Связано это с обработкой мультимедийной информации.
Это MMX+ и это - совсем другое.
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007781
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет скорости вычислений для разных типов
Код: plsql
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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
SQL> DEFINE loop_count = "1E+9";
SQL> 
SQL> DECLARE
  2  	s_number NUMBER := 0;
  3  	-- 32-bit floating point number. This data type requires 4 bytes.
  4  	s_binary_float BINARY_FLOAT := 0;
  5  	-- 64-bit floating point number. This data type requires 8 bytes.
  6  	s_binary_double BINARY_DOUBLE := 0;
  7  	--
  8  	s_pls_integer PLS_INTEGER;
  9  	--
 10  	t_start NUMBER;
 11  BEGIN
 12  	dbms_output.put_line('Loop count = ' || &loop_count);
 13  	-- NUMBER
 14  	t_start := dbms_utility.get_cpu_time;
 15  	s_number := 0;
 16  	FOR n IN 1 .. &loop_count LOOP
 17  	   s_number := s_number + 1;
 18  	END LOOP;
 19  	dbms_output.put_line('NUMBER	    exec time = '
 20  	   ||(dbms_utility.get_cpu_time-t_start)/100|| ' res='||s_number);
 21  	--
 22  	-- BINARY_FLOAT
 23  	s_binary_float := 0;
 24  	t_start := dbms_utility.get_cpu_time;
 25  	FOR n IN 1 .. &loop_count LOOP
 26  	   s_binary_float := s_binary_float + 1;
 27  	END LOOP;
 28  	dbms_output.put_line('BINARY_FLOAT  exec time = '
 29  	   ||(dbms_utility.get_cpu_time-t_start)/100|| ' res='||s_binary_float);
 30  	--
 31  	-- BINARY_DOUBLE
 32  	s_binary_double := 0;
 33  	t_start := dbms_utility.get_cpu_time;
 34  	FOR n IN 1 .. &loop_count LOOP
 35  	   s_binary_double := s_binary_double + 1;
 36  	END LOOP;
 37  	dbms_output.put_line('BINARY_DOUBLE exec time = '
 38  	   ||(dbms_utility.get_cpu_time-t_start)/100|| ' res='||s_binary_double);
 39  	--
 40  	-- PLS_INTEGER
 41  	s_pls_integer := 0;
 42  	t_start := dbms_utility.get_cpu_time;
 43  	FOR n IN 1 .. &loop_count LOOP
 44  	   s_pls_integer := s_pls_integer + 1;
 45  	END LOOP;
 46  	dbms_output.put_line('PLS_INTEGER   exec time = '
 47  	   ||(dbms_utility.get_cpu_time-t_start)/100|| ' res='||s_pls_integer);
 48  END;
 49  /
Loop count = 1000000000
NUMBER        exec time = 30.44 res=1000000000
BINARY_FLOAT  exec time = 17.1  res=1.6777216E+007 = 16 777 216 (совсем не миллиард)
BINARY_DOUBLE exec time = 16.92 res=1.0E+009
PLS_INTEGER   exec time = 11.11 res=1000000000

PL/SQL procedure successfully completed.

Elapsed: 00:01:15.92


Выполнялось на
BANNER_FULL
----------------------------------------------------------------------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.4.0.0.0

Для простоты экспериментов прикладываю скрипт.
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007872
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus,

ну, все-таки на чистом сложении смесь бедная.
давай вот такую возьмём, на базе твоего шаблона, по порядку величны
показывающего деградацию некоего некоего условного синтетического вычислительного процесса:

Код: plsql
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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
alter session set plsql_debug = FALSE -- это главное
/
alter session set plsql_optimize_level = 2
/
alter session set plsql_code_type = native
/
set serveroutput on;

DECLARE
   outer_loop_count constant pls_integer := 100000; --00; -- уменьшим, чтобы не ждать слишком долго
   inner_loop_count constant pls_integer := 100;
   
   cn_sum constant Number := 1.015;
   cd_sum constant binary_double := 1.015d;
   cf_sum constant binary_float := 1.015f;
   
   s_number NUMBER;
   s_number2 NUMBER;
   -- 32-bit floating point number. This data type requires 4 bytes.
   s_binary_float BINARY_FLOAT;
   s_binary_float2 BINARY_FLOAT;
   -- 64-bit floating point number. This data type requires 8 bytes.
   s_binary_double  BINARY_DOUBLE;
   s_binary_double2 BINARY_DOUBLE;
   --
   t_start NUMBER;
   t_stop Number;
   
BEGIN
   dbms_output.put_line('Loop count = ' || outer_loop_count);
   -- NUMBER
   t_start := dbms_utility.get_cpu_time;
   s_number := 0.0;
   FOR n IN 1 .. outer_loop_count LOOP
     s_number2 := 1.0;
     For k in 1..inner_loop_count
     Loop
       s_number2 := s_number2 * cn_sum + Log(2,s_number2); 
     End Loop;    
     s_number := s_number + s_number2;
     s_number := s_number + log(2,s_number);
   END LOOP;

   t_stop := dbms_utility.get_cpu_time();
   dbms_output.put_line('NUMBER        exec time = '
      ||0.01*(t_stop-t_start)|| ' res='||s_number);
   -- 
   -- BINARY_FLOAT
   s_binary_float := 0.0f;
   t_start := dbms_utility.get_cpu_time;
   FOR n IN 1 .. outer_loop_count LOOP
     s_binary_float2 := 1.0f;
     For k in 1 .. inner_loop_count
     Loop
       s_binary_float2 := s_binary_float2 * cf_sum + log(2, s_binary_float2); 
     End Loop;         
      s_binary_float := s_binary_float + s_binary_float2; -- 1.0f;
      s_binary_float := s_binary_float + log(2,s_binary_float);        
   END LOOP;
   t_stop := dbms_utility.get_cpu_time();
   dbms_output.put_line('BINARY_FLOAT  exec time = '
      ||0.01*(t_stop-t_start)|| ' res='||s_binary_float);
   -- 
   -- BINARY_DOUBLE
   s_binary_double := 0.0d;
   t_start := dbms_utility.get_cpu_time;
   FOR n IN 1 .. outer_loop_count LOOP
     s_binary_double2 := 1.0d;
     For k in 1 .. inner_loop_count
     Loop
       s_binary_double2 := s_binary_double2 * cd_sum + log(2,s_binary_double2); 
     End Loop;         
      s_binary_double := s_binary_double + s_binary_double2; 
      s_binary_double := s_binary_double + log(2,s_binary_double);              
   END LOOP;
   t_stop := dbms_utility.get_cpu_time();
   dbms_output.put_line('BINARY_DOUBLE exec time = '
      ||0.01*(t_stop-t_start)|| ' res='||s_binary_double);

END;
/

...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40007960
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus
Насчет скорости вычислений для разных типов

compile plsql_code_type=native ?

.....
stax
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40008000
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
SQL*Plus
Насчет скорости вычислений для разных типов

compile plsql_code_type=native ?
No, by default.
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40009994
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав Любомудров
Вроде как микропроцессоры BCD не умеют, это EC-ки умели
Да и к BCD NUMBER имеет мало отношения, просто похож

И выбрана такая система хранения была, КМК, для удобства сравнения (сравнивается как строка) + точность + независимость от Endian
Ну и тоже слышал, что калька/подобие с IBM DB2


У интела 387 (кто помнит такое) были BCD инструкции для преобразования в IEEE.
С тех пор так они и остались. Быстрые, "бесплатные", поддерживают длинную мантиссу (не короче NUMBER)
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40010042
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже интересно, видел ли ты хоть раз этот сопроцессор вживую
Или, хотя бы материнку, где под него предусмотрен слот

Я видел пару раз -- у нас, по крайней мере, это была очень большая редкость, хотя контора и не маленькая
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40010044
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав Любомудров
Даже интересно, видел ли ты хоть раз этот сопроцессор вживую
Или, хотя бы материнку, где под него предусмотрен слот

Я видел пару раз -- у нас, по крайней мере, это была очень большая редкость, хотя контора и не маленькая


387 был роскошью, не видел. Был знаком с 80287. А что, уже пришло время рассказывать про "вот были 4.77, богатыри-не вы"?

;-)
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40010047
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну ты первый начал
...
Рейтинг: 0 / 0
Скорость арифметики с number
    #40017767
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Упоминание бенчмарков в другой теме заставило меня вспомнить про обсуждаемую скорость NUMBER.

Посчитал число e до шести знаков с NUMBER и с BINARY_DOUBLE.
Арифметика совпадает (само собой, мантиссы огромные).
Разница в скорости примерно в 10 раз в пользу BINARY_DOUBLE.
Главная операция в моем тесте - умножение двух чисел.

ТС > Если только на порядок медленнее, можно жить.

Вердикт: можно жить.
...
Рейтинг: 0 / 0
38 сообщений из 38, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Скорость арифметики с number
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]