powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Скорость арифметики с number
13 сообщений из 38, страница 2 из 2
Скорость арифметики с 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
13 сообщений из 38, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Скорость арифметики с number
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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