powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / внешняя библиотека на Си
18 сообщений из 18, страница 1 из 1
внешняя библиотека на Си
    #39259560
relav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вычислительная задача была внесена во внешнюю функцию написанную на Си, для ускорения вычислений. При тестировании
данной функции на Си время оказалось следующим: при первом запуске функции - 20 секунд, а при следующих запусках -0.6 секунд. Я объясняю такую разность показателей времени тем, что оракл при первом запуске функции загружает библиотеку в память, на что тратится время, а при последующих вызовах функции библиотека уже в памяти и следовательно загружать ее не нужно, что отражается на времени. Меня интересует, верно ли я объясняю разницу времени и если верно, то как можно библиотеку раз загрузить и чтоб оракл ее оставил в памяти и не выгружал?
...
Рейтинг: 0 / 0
внешняя библиотека на Си
    #39259578
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
relav,

Внешние процедуры запускаются листенером как отдельный процесс. Prespawn настраивается в листенере.
Но 20-0.6 секунд на запуск процесса это перебор. Причина в другом.
...
Рейтинг: 0 / 0
внешняя библиотека на Си
    #39259579
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
relavЯ объясняю такую разностьНу я надеюсь ты проанализировал что значит каждая из букв DDL и как выполняется связывание конкретно в Оракле через extproc.
relavможно библиотеку раз загрузить и чтоб оракл ее оставил в памяти и не выгружал?Нельзя. Отдельный экземпляр для каждой сессии.
...
Рейтинг: 0 / 0
внешняя библиотека на Си
    #39259580
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopкаждая из букв DLLМдэээ...
...
Рейтинг: 0 / 0
внешняя библиотека на Си
    #39259583
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
relav,

Сколько занимает первый и последующий вызовы при линковке к своему бинарнику а не к Ораклу?
...
Рейтинг: 0 / 0
внешняя библиотека на Си
    #39259588
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вычисления подразумевают выделение заметного объема памяти (особенно мелкими порциями), то дело может быть в этом.
...
Рейтинг: 0 / 0
внешняя библиотека на Си
    #39259589
relav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop,

не понимаю, что имеется ввиду?
...
Рейтинг: 0 / 0
внешняя библиотека на Си
    #39259591
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
relavdbms_photoshop,
не понимаю, что имеется ввиду?
С очевидностью имеется ввиду чистый эксперимент - выполнение вычислений данной библиотекой без привлечения oracle.
Напишите программку (скорее всего уже написана - ведь тестировали как-то), которая выполнит ровно те же вычисления, что и при вызове через oracle
...
Рейтинг: 0 / 0
внешняя библиотека на Си
    #39259598
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вряд ли под "вычислениями" подразумевается что-то безумное сложное над 2-мя числами на 20 сек.. А вот дальше вопрос, что дергает автор из этой библиотеки.

Если C-код дергает Oracle-левые ф-ции, то причина может быть банальная: SGA, buffer cache и так далее )))

От замены PL/SQL на C производительность может повысится, а может и понизиться. Сама по себе латинская буква "c" в название языка программирования прирост производительности НЕ гарантирует )))
...
Рейтинг: 0 / 0
внешняя библиотека на Си
    #39259647
relav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,

а с этим не может быть связана задержка?

After the external procedure completes, the agent remains active throughout your Oracle Database session; when you log off, the agent is killed. Consequently, you incur the cost of launching the agent only once, no matter how many calls you make. Still, you should call an external procedure only when the computational benefits outweigh the cost.
...
Рейтинг: 0 / 0
внешняя библиотека на Си
    #39259671
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да с чем угодно может быть связана задержка.

Не очень понятно, какую задачу/проблему решаете. В зависимости от задачи - нужно выбирать средство.

Подход "на С быстро, на PL/SQL медленно" очень детский. Так же как и подход "при первом запуске функции - 20 секунд, а при следующих запусках -0.6 секунд. Я объясняю..."

Родные средства Oracle: SQL (Select), PL/SQL, в какой-то мере Java... внешние: C и прочее.

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

-2-Внешние процедуры запускаются листенером как отдельный процесс. Prespawn настраивается в листенере.
Но 20-0.6 секунд на запуск процесса это перебор. Причина в другом.
Плюсуюсь.

Возможно у автора сами вычисления быстрые, а при первом вызове выполняется какая-то долгая инициализация данных. Но это все равно проблема алгоритма/программиста, а не Oracle.
...
Рейтинг: 0 / 0
внешняя библиотека на Си
    #39259775
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevДа с чем угодно может быть связана задержка.

Не очень понятно, какую задачу/проблему решаете. В зависимости от задачи - нужно выбирать средство.

Подход "на С быстро, на PL/SQL медленно" очень детский . Так же как и подход "при первом запуске функции - 20 секунд, а при следующих запусках -0.6 секунд. Я объясняю..."

Родные средства Oracle: SQL (Select), PL/SQL, в какой-то мере Java... внешние: C и прочее.

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

-2-Внешние процедуры запускаются листенером как отдельный процесс. Prespawn настраивается в листенере.
Но 20-0.6 секунд на запуск процесса это перебор. Причина в другом.
Плюсуюсь.

Возможно у автора сами вычисления быстрые, а при первом вызове выполняется какая-то долгая инициализация данных. Но это все равно проблема алгоритма/программиста, а не Oracle.
+1
я бы назвал - "святая" истина предпоследнего десятилетия прошлого века
2 ТС
с той поры столько "более других" вариантов явилось и пере-появилось (и это потому, что оно таки болело )
короче, имхо, хотите си - пишите на си, но не забывайте сравнить решение с pl/sql + (например) реалнативкомпиляцией
...
Рейтинг: 0 / 0
внешняя библиотека на Си
    #39260051
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-relav,

Внешние процедуры запускаются листенером как отдельный процесс. Prespawn настраивается в листенере.
Но 20-0.6 секунд на запуск процесса это перебор. Причина в другом.Про какой Prespawn идет речь?

Может, имеется ввиду Multithreaded extproc Agent ?
...
Рейтинг: 0 / 0
внешняя библиотека на Си
    #39261104
Cristiano_Rivaldo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В коде библиотеки есть функция malloc ?
...
Рейтинг: 0 / 0
внешняя библиотека на Си
    #39264064
relav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cristiano_Rivaldo,

в коде есть функции OCIMemoryAlloc().

Я делал замер времени в си коде с помощью функции clock и результат оказался удивительным. Время выполнения си программы занимает 5 секунд, а когда вызываешь программу из оракла, оракл отрабатывает 20 секунд, куда девается 15 секунд - не понятно.
Код pl/sql привожу:
Код: 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.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
 FUNCTION f_getOffsettedQuality(locationId integer, locationType integer) RETURN quality_tab
  IS
      l_quality_level quality_tab := quality_tab();
      l_level varchar2(10) := 0;
      lMinx float;
      lMaxX float;
      lMinY float;
      lMaxY float;
      cnt integer;
      lcity_id integer;
      locBlob BLOB;
      gsmOffset integer := 100; --default value for location offsetting
      umtsOffset integer := 100; --default value for location offsetting
      OffsetX    Number ; 
      OffsetY    Number ;       
      l_offset1 Binary_Integer := 0;
      l_offset2 Binary_Integer := 0;
      l_area    Double precision:=0.0;
      l_proc    Double Precision :=0.0;  
      cover binary_integer;      
      c varchar2(100);
  BEGIN
       IF locationType = 0 THEN--house
            
           Select hg.gis_xmin, hg.gis_xmax, hg.gis_ymin, hg.gis_ymax, s.city 
             into lMinx, lMaxX, lMinY, lMaxY,lcity_id 
           from house_gis hg 
           Join house h On hg.id = h.id
           Join street s On h.street = s.id
           where hg.id = locationId;
           --check if exists config for city_id and get offsetting
           select count(*) 
             into cnt 
           from DICT.CITY_CONFIG cc 
           where cc.city_id = lcity_id;
           
           if cnt > 0 then 
               select nvl(cc.sig_house_gsm, gsmOffset), nvl(cc.sig_house_3g, umtsOffset) 
                 into gsmOffset, umtsOffset 
               From CITY_CONFIG cc 
               where cc.city_id = lcity_id;
           else  
               select nvl(cc.sig_house_gsm, gsmOffset), nvl(cc.sig_house_3g, umtsOffset) 
                 into gsmOffset, umtsOffset 
               From CITY_CONFIG cc 
               where cc.city_id = 0;
           end if;
           
           select h.gis into locBlob from house_gis h where h.id = locationId;
                     
       ELSIF locationType = 1 THEN--street
           select distinct h.gis_xmin, h.gis_xmax, h.gis_ymin, h.gis_ymax, s.city 
             into lMinx, lMaxX, lMinY, lMaxY, lcity_id 
           from street_gis h, street s 
           where s.id = h.id and h.id = locationId;
           --check if exists config for city_id and get offsetting
           select count(*) 
              into cnt 
           from DICT.CITY_CONFIG cc 
           where cc.city_id = lcity_id;
           
           if cnt > 0 then 
               select nvl(cc.sig_house_gsm, gsmOffset), nvl(cc.sig_house_3g, umtsOffset) 
                  into gsmOffset, umtsOffset 
               from CITY_CONFIG cc 
               where cc.city_id = lcity_id;
           else  
               select nvl(cc.sig_house_gsm, gsmOffset), nvl(cc.sig_house_3g, umtsOffset) 
                 into gsmOffset, umtsOffset 
               from CITY_CONFIG cc 
               where cc.city_id = 0;
           end if;
           
           select h.gis 
             into locBlob 
           from street_gis h 
           where h.id = locationId;
                  
       ELSIF locationType = 2 THEN--city
           select distinct h.gis_xmin, h.gis_xmax, h.gis_ymin, h.gis_ymax, h.id 
             into lMinx, lMaxX, lMinY, lMaxY,lcity_id 
           from city_gis h 
           Join city c On h.id = c.id
           where h.id = locationId;
           --check if exists config for city_id and get offsetting
           select count(*) into cnt 
           from DICT.CITY_CONFIG cc 
           where cc.city_id = lcity_id;
           
           if cnt > 0 then 
               select nvl(cc.sig_house_gsm, gsmOffset), nvl(cc.sig_house_3g, umtsOffset) 
                 into gsmOffset, umtsOffset 
               from CITY_CONFIG cc 
               where cc.city_id = lcity_id;
           end if;
           
           select h.gis 
             into locBlob 
           from city_gis h 
           where h.id = locationId;
                      
       END IF;

       OffsetX := gsmOffset;
       OffsetY := gsmOffset;
       pac_geocoding.p_meters2geo(OffsetX, OffsetY);
          
       FOR r IN 
       (
           SELECT g1.gis, g1.threshold,g1.gis_xmax,g1.gis_xmin,g1.gis_ymax,g1.gis_ymin
           FROM coverage.QUALITY_GIS g1
           WHERE g1.signal_type = 'GSM' AND g1.detail_m = 5
               AND (lMinx - OffsetX < g1.gis_xmax 
               AND lMaxX + OffsetX > g1.gis_xmin 
               AND lMinY - (OffsetY ) < g1.gis_ymax 
               AND lMaxY + (OffsetY ) > g1.gis_ymin) --offsetted bounds..don't ask...
           ORDER BY g1.threshold  DESC       
       )          
       Loop
-- call external c function
              pac_gis.PolygonsIntersection(r.gis,locBlob,r.gis_xmax,r.gis_xmin,r.gis_ymax,r.gis_ymin,cover);

              $IF pac_3g_service.debugging=1 $THEN    
                dbms_output.put_line('threshold ='||r.threshold||' area='||l_area);
              $END            
              
           IF cover = 1  THEN
              l_level := r.threshold;
              EXIT;
           END IF;
       
       END LOOP;
              
       IF l_level != 0 THEN
         l_quality_level.extend();  
         cnt := l_quality_level.count;
         l_quality_level(cnt) := quality_t('',''); 
         l_quality_level(cnt).Standart := 'GSM';  
         l_quality_level(cnt).Sig_Level:= l_level;
         l_level := 0;
         cover   := 0;
       END IF;
      -- ==================================== 
       OffsetX := umtsOffset;
       OffsetY := umtsOffset;
       pac_geocoding.p_meters2geo(OffsetX, OffsetY);
                  
       FOR r IN 
       (
           SELECT g1.id,g1.gis, g1.threshold,g1.gis_xmax,g1.gis_xmin,g1.gis_ymax,g1.gis_ymin
           FROM coverage.QUALITY_GIS g1
           WHERE g1.signal_type = 'UMTS' AND g1.detail_m = 5
               AND (lMinx - OffsetX < g1.gis_xmax 
               AND lMaxX + OffsetX > g1.gis_xmin 
               AND lMinY - (OffsetY ) < g1.gis_ymax 
               AND lMaxY + (OffsetY ) > g1.gis_ymin) --offsetted bounds..don't ask...
           ORDER BY g1.threshold  DESC       
       )          
       Loop
--call external c function        
             pac_gis.PolygonsIntersection(r.gis,locBlob,r.gis_xmax,r.gis_xmin,r.gis_ymax,r.gis_ymin,cover);
             
              $IF pac_3g_service.debugging=1 $THEN    
                dbms_output.put_line('threshold ='||r.threshold||' area='||l_area);
              $END 

           IF cover = 1  THEN
             l_level := r.threshold;
             EXIT;
           END IF;
 
       END LOOP;               
       
       IF l_level != 0 THEN
         l_quality_level.extend();  
         cnt := l_quality_level.count;
         l_quality_level(cnt) := quality_t('','');  
         l_quality_level(cnt).Standart := '3G';  
         l_quality_level(cnt).Sig_Level:= l_level;    
       END IF;
       $IF pac_3g_service.debugging=1 $THEN 
           dbms_output.put_line('f_getQuality rc='||l_quality_level.count);
           FOR r IN 1..l_quality_level.count LOOP
               dbms_output.put_line('standart='||l_quality_level(r).standart||' level='||l_quality_level(r).sig_level);
           END LOOP;
       $END 

       RETURN l_quality_level;
  END;

...
Рейтинг: 0 / 0
внешняя библиотека на Си
    #39264077
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
relav,

Для определения узкого места имеет сравнивать один вызов при линковке к сишному бинарнику и один вызов при линковке к Ораклу как тебя уже было сказано. Зачем ты запостил сюда 200 строчек говнокода совершенно непонятно.
Если проблема определить где узкое место в pl/sql - используй dbms_trace/dbms_hprof, но по твоему первому посту проблема определить куда уходит время при первом вызове сишной библиотеки.
Неужели подход по выкидыванию не нужного
...
Рейтинг: 0 / 0
внешняя библиотека на Си
    #39264079
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshoprelav,

Для определения узкого места имеет смысл сравнивать один вызов при линковке к сишному бинарнику и один вызов при линковке к Ораклу как тебя уже было сказано. Зачем ты запостил сюда 200 строчек говнокода совершенно непонятно.
Если проблема определить где узкое место в pl/sql - используй dbms_trace/dbms_hprof, но по твоему первому посту проблема определить куда уходит время при первом вызове сишной библиотеки.
Неужели подход по выкидыванию ненужного так сложен для понимания.Fixed.
...
Рейтинг: 0 / 0
внешняя библиотека на Си
    #39264135
Jonhson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop как всегда сама доброта
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / внешняя библиотека на Си
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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