Гость
Map
Форумы / Informix [игнор отключен] [закрыт для гостей] / Просьба, выполните тест на информиксе. / 5 сообщений из 5, страница 1 из 1
30.11.2011, 15:59
    #37552333
mikron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба, выполните тест на информиксе.
я думаю, не вся заглядывают в склочный форум, поэто продублирую здесь.
какая ДБМС самая "шустрая" для выполнения хранимых процедур?
Пожалуста пропустите тест на компутере десктопного класса.
Нагрузка в основном на ЦПУ: райды, саны и т.д. по идее не должны сильно влиять на результат. Тест разумно не паралелится, т.е. кол-во ядер тоже не сильно важно.
Заранее спасибо.
...
Рейтинг: 0 / 0
30.11.2011, 19:02
    #37552791
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба, выполните тест на информиксе.
mikron, есть проблема:

В Informix нет встроенной функции rand(). Её нужно либо реализовывать либо как ХП на SPL, либо как внешнюю на Си/Java.
Вариант с ХП на SPL сильно повлияет на результаты тестирования.
У меня вызов теста производительности для этого варианта rand на SPL дал при 1 000 000 вызовах 35,5 секунд.
для rand

Код: plaintext
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.
-- @(#)$Id: ifaq04c.htm,v 1.11 1999/01/09 14:30:06 root Exp $ -- -- Simple emulation of SRAND and RAND in SPL -- Using random number generator suggested by C standard (ISO 9899:1990) 


CREATE PROCEDURE sp_setseed(n INTEGER)
  DEFINE GLOBAL seed DECIMAL( 10 ) DEFAULT  1 ;
  LET seed = n;
END PROCEDURE;

CREATE PROCEDURE sp_random() RETURNING INTEGER;
	DEFINE GLOBAL seed DECIMAL( 10 ) DEFAULT  1 ;
	DEFINE d DECIMAL( 20 , 0 );
	LET d = (seed *  1103515245 ) +  12345 ;
	-- MOD function does not handle 20-digit values...  Dammit!!
	LET seed = d -  4294967296  * TRUNC(d /  4294967296 );
	RETURN MOD(TRUNC(seed /  65536 ),  32768 );
END PROCEDURE;

CREATE PROCEDURE my_random(nMax INTEGER) RETURNING INTEGER;
  RETURN TRUNC(sp_random() /  32767  * nMax);
END PROCEDURE;

create procedure my_test_random(
  nCount INTEGER DEFAULT  1000000 
)
  define i, c integer;
  let i = nCount;
  while i >  0 
    let c = my_random( 1000 );
    let i = i -  1 ;
  end while;
end procedure;


create procedure my_test_sp_random(
  nCount INTEGER DEFAULT  1000000 
)
  define i, c integer;
  let i = nCount;
  while i >  0 
    let c = sp_random();
    let i = i -  1 ;
  end while;
end procedure;

-- тест используемого rand
execute procedure my_test_random( 1000000 ); -- 35.5 сек

-- убираем один вложенный вызов SP
execute procedure my_test_sp_random( 1000000 ); -  23 . 0  сек



Тем не менее, запуск ХП с этим rand выдал
execute procedure my_test(1000000); -- 01:05.141
select count(*) from t2; -- 2849

Если кто-то прикрутит нормальную внешнюю Си для rand - время может уменьшиться почти в два раза

для алгоритма, ежели коллеги захотя покрутить
Код: plaintext
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.
82.
83.
84.
create table t1 (
  c1 integer not null, 
  c2 integer not null,
  c3 integer not null,
  c4 integer not null,
  primary key (c1, c4)
); 

create index t1i1 on t1 (c1, c3, c2);

create temp table t2(
  c1 integer not null, 
  c2 integer not null, 
  c3 integer not null)
with no log;


create procedure my_fill_test(
)

  define i integer;
  define j integer;

  delete from t1;
  let i =  1000 ;
  while i >  0 
    let j =  20 ;
    while j >  0  
      insert into t1(c1, c2, c3, c4)
        values (i, my_random( 1000 ), my_random( 1000 ), j);
      let j = j -  1 ;
    end while;
    let i = i -  1 ;
  end while;
end procedure;

create procedure my_test(
  nCount INTEGER DEFAULT  1000000 
)

  define p integer;
  define i integer;
  define j integer;
  define cur_c2 integer;
  define k integer;
	
  delete from t2;
	
  let p = my_random( 1000 );
  let i = nCount;
  while i >  0 
    let j = my_random( 1000 );
<<lbl_each_t>>
    let k =  1 ;
    foreach
      select {+ FIRST_ROWS }
             c2 
        into cur_c2
        from t1
          where c1 = p
        order by abs(c3 - j) desc

        let k = k +  1 ;
        if k >  10  then
          exit foreach;
        end if;
        insert into t2 (c1, c2, c3)
          values (p, cur_c2, j);
        if cur_c2 != p then
          let p = cur_c2;
          if my_random( 10 ) >  4  then
            goto lbl_each_t;
          end if;
        end if;
    end foreach;
    let i = i -  1 ;
  end while;
end procedure;

execute procedure sp_setseed( 3121234 );
execute procedure my_fill_test(); -- 3 сек

execute procedure my_test( 1000000 ); -- 01:05.141
select count(*) from t2; -- 2849


Писал в конце раб.дня, не задумываясь об оптимизациях./
Проц: Intel(R) Celeron(R) CPU E3200 @ 2.40GHz
...
Рейтинг: 0 / 0
30.11.2011, 19:06
    #37552797
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба, выполните тест на информиксе.
Да, Informix 11.50FC6 (на Linux x86_64)
...
Рейтинг: 0 / 0
30.11.2011, 20:35
    #37552914
mikron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба, выполните тест на информиксе.
АнатоЛой, Спасибо!
...
Рейтинг: 0 / 0
01.12.2011, 20:39
    #37554939
svat2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба, выполните тест на информиксе.
АнатоЛойЕсли кто-то прикрутит нормальную внешнюю Си для rand - время может уменьшиться почти в два раза

execute procedure my_fill_test(); -- 3 сек

execute procedure my_test(1000000); -- 01:05.141
select count(*) from t2; -- 2849



прикрутил UDR на Си - udr_rand(), соотв. в вызываемых ХП поменял все вызовы my_random() на нее.

(на Си не писал уже лет 20, так что простите, если чего неоптимально... но работает, проверял.)
#include <stdlib.h>
#include <public/mi.h>


mi_integer udr_rand ( mi_integer nmax )
{

mi_integer res;
float tmp,tmp_rand_max;

tmp_rand_max = (float) RAND_MAX;
tmp = nmax * ( rand () / tmp_rand_max ) ;

res = (int) tmp ;

return res;
}

int main ( )
{

return 1;
}


затестил на том же железе (версия Информикса, правда чуть другая: 11.50.FC9IE ) :)

execute procedure my_fill_test(); -- 1.7 сек

execute procedure my_test(1000000); -- в среднем ок. 27 сек.

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


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