powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / С++ Class Builder, Увеличение производительности строковых функций
25 сообщений из 34, страница 1 из 2
С++ Class Builder, Увеличение производительности строковых функций
    #34366117
dGrichine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ, кто пользовался С++ Class Builder, подскажите где грабли? Почему результаты противоположные? использую PB 6.5.1

ZhV кат-то написал такое:
ZhV выяснилась странная вещь – огромная "тормознутость" строковых функций PowerBuilder – типа POS, MID… С такой скоростью для сложных datawindow (от полусотни datawindow.objects) – 10000 вызовов POS – это до десяти секунд. Пришлось писать отдельную dll-ку под API-вызов на С++ для строковых функций. Оказалось , что VC++ с PB работат глючно. Потратил время – Vatcom C++ из PB пакета версии 6.5 – нормально – разница в скорости раз в сто.

, и я решил протестить это решение и применить его, если результаты будут достойные.
создал DLL, все как по докам, написал С++ код, но результаты разочаровывают...

Делаю тестовое приложение, в котором тестирую функцию POS из Power++ и два варианта реализации той же задачи на С++

Код userobject'a
Код: 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.
$PBExportHeader$uo_string.sru
forward
global type uo_string from cplusplus
end type
end forward

global type uo_string from cplusplus
string LibraryName="c:\xtest\xtest.dll"
event constructor pbm_constructor
event destructor pbm_destructor
end type
global uo_string uo_string

type prototypes
private function ulong uo_string_CPP_CONSTRUCTOR() library 'xtest.dll'
private subroutine uo_string_CPP_DESTRUCTOR( ulong th ) library 'xtest.dll'
public function long uo_stringcf_findstr2 ( ulong ThisHandle, string body, string search ) library 'xtest.dll'
public function long uo_stringcf_findstr ( ulong ThisHandle, string body, string search ) library 'xtest.dll'
end prototypes
forward prototypes
public function long cf_findstr ( string body, string search )
public function long cf_findstr2 ( string body, string search )
end prototypes

on uo_string.constructor;
ThisHandle = uo_string_CPP_CONSTRUCTOR()
end on

on uo_string.destructor;
uo_string_CPP_DESTRUCTOR( ThisHandle )
end on

public function long cf_findstr ( string body, string search )
return uo_stringcf_findstr ( ThisHandle, body, search )
end function

public function long cf_findstr2 ( string body, string search )
return uo_stringcf_findstr2 ( ThisHandle, body, search )
end function

on uo_string.create
TriggerEvent( this, "constructor" )
end on

on uo_string.destroy
TriggerEvent( this, "destructor" )
end on

код С++
Код: 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.
/* WATCOM Interface Generator   Version 1.0 */
/* This file contains code generated by PowerBuilder.
 * Do not modify code delimited by comments of the form:
 * // $PB$ -- begin generated code for object <>.  Do not modify this code
 * // $PB$ -- end generated code for object <>.
 * This file contains the bodies the functions for your user object.
 */ 



#include <pbdll.h>

#include "uo_str1O.hpp"


// $PB$ -- begin generated code for object <uo_string>.  Do not modify this code
#if  1 
long uo_string::cf_findstr( char * body, char * search ) {
// $PB$ -- end generated code for object <uo_string>.
//==================================

  char * pch;
  pch = strstr (body,search);

  if (pch != NULL)
  {
		return (pch-body+ 1 );
  }
  return - 1 ; // failure
}
#endif // PowerBuilder code, do not remove 


// $PB$ -- begin generated code for object <uo_string>.  Do not modify this code
#if  1 
long uo_string::cf_findstr2( char * body, char * search ) {
// $PB$ -- end generated code for object <uo_string>.
//==================================

    /*
     * PUT YOUR CODE HERE
     */
	int len = strlen(body);
	int len2 = strlen(search); // search len

	for(int i =  0 ; i < len; i++)
	{
		if(body[i] == search[ 0 ])
		{
			bool ichk = true;

			for(int z =  0 ; z < len2; z++)
			{
				if(body[i+z] == search[z])
				{
				}
				else
				{
					ichk = false;
				}
			}

			if(ichk == true)
			{
				return i+ 1 ;
			}
		}
	}

	return - 1 ; // failure

}
#endif // PowerBuilder code, do not remove 

Код Power++
Код: 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.
long i, ll_cycles =  100000 
long ll_i[ 3 ], ll_start[ 3 ], ll_stop[ 3 ]
string ls_body, ls_search
uo_string luo_string
luo_string = create uo_string

ls_body = "Hello"
ls_search = "ll"


ll_start[ 1 ] = CPU()
for i =  1  to ll_cycles
	ll_i[ 1 ] = pos ( ls_body, ls_search )
next
ll_stop[ 1 ] = CPU()

ll_start[ 2 ] = CPU()
for i =  1  to ll_cycles
	ll_i[ 2 ] = luo_string.cf_findstr ( ls_body, ls_search )
next 
ll_stop[ 2 ] = CPU()

ll_start[ 3 ] = CPU()
for i =  1  to ll_cycles
	ll_i[ 3 ] = luo_string.cf_findstr2 ( ls_body, ls_search )
next 
ll_stop[ 3 ] = CPU()

messageBox('Cycles =' + string(ll_cycles), &
           'Power++(pos) =' + string(ll_stop[ 1 ] - ll_start[ 1 ]) + ', string found='+string(ll_i[ 1 ]) + '~r~n' + &
           'C++ (strstr) =' + string(ll_stop[ 2 ] - ll_start[ 2 ]) + ', string found='+string(ll_i[ 2 ]) + '~r~n' + &
			  'C++ (custom) =' + string(ll_stop[ 3 ] - ll_start[ 3 ]) + ', string found='+string(ll_i[ 3 ]) )

Результаты работы в скрине ниже - циклов 100000, получается, что POS работает в 3 раза быстрее, неужели, что С++ при таком использовании настолько медленнее?
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34366430
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dGrichineНарод, кто пользовался С++ Class Builder, подскажите где грабли? Почему результаты противоположные? использую PB 6.5.1
...
Хотелось бы посмотреть на результаты для строк приличной длины, символов так на несколько сотен, несколько тысяч.
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34366447
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dGrichineа зачем после ichk = false; продолжать крутить цикл? ;-)
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34366625
dGrichine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗоринАндрей
Хотелось бы посмотреть на результаты для строк приличной длины, символов так на несколько сотен, несколько тысяч.[/quot]

Вот такой тест на строках большой длины:

Код: 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.
long i, ll_cycles =  10000 
long ll_i[ 3 ], ll_start[ 3 ], ll_stop[ 3 ]
string ls_body, ls_search
uo_string luo_string
luo_string = create uo_string

for i =  1  to  10000 
	ls_body += "Hello"
	if i= 9000  then
		ls_body += "Привет"
	end if
next

ls_search = "вет"

ll_start[ 1 ] = CPU()
for i =  1  to ll_cycles
	ll_i[ 1 ] = pos ( ls_body, ls_search )
next
ll_stop[ 1 ] = CPU()

ll_start[ 2 ] = CPU()
for i =  1  to ll_cycles
	ll_i[ 2 ] = luo_string.cf_findstr ( ls_body, ls_search )
next 
ll_stop[ 2 ] = CPU()

ll_start[ 3 ] = CPU()
for i =  1  to ll_cycles
	ll_i[ 3 ] = luo_string.cf_findstr2 ( ls_body, ls_search )
next 
ll_stop[ 3 ] = CPU()

messageBox('Cycles =' + string(ll_cycles) + '; Lenght ls_body =' + string(len(ls_body)), &
           'Power++(pos) =' + string(ll_stop[ 1 ] - ll_start[ 1 ]) + ', string found='+string(ll_i[ 1 ]) + '~r~n' + &
           'C++ (strstr) =' + string(ll_stop[ 2 ] - ll_start[ 2 ]) + ', string found='+string(ll_i[ 2 ]) + '~r~n' + &
			  'C++ (custom) =' + string(ll_stop[ 3 ] - ll_start[ 3 ]) + ', string found='+string(ll_i[ 3 ]) )

Результат на скриншоте - ситуация усугубляется :(
В чем же дело? Может не надо использовать класс билдер а писать с нуля DLL на Watcom C++? Хотя в объявлениях пользовательского объекта унаследованного from cplusplus класса идут такие же объявления на внешние функции из ДЛЛ...
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34366917
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело в том, что достигнуть повышения производительности можно только перенеся в C++ сам алгоритм (ну или его затратную часть, например цикл).
Иначе накладные расходы на вызовы внешних фунций будут нивелировать эффект от ускорения самих функций. Особенно в таких случаях как POS().
Вы думаете внутри PB pos() реализована как-то по-другому, чем через strstr() ? Нет.
Так что в этом конкретном случае перенос ф-и в С++ саму ф-ю не ускорил, да еще и накладные расходы добавились - вот и замедлилось :)

Что же касается использования PB C++ Class builder для данной задачи - я считаю, что вполне можно обойтись просто External Functions.
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34366995
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторРезультат на скриншоте - ситуация усугубляется :(
Для больших строк есть более быстрые алгоритмы чем наивный поиск.
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34367058
dGrichine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЧто же касается использования PB C++ Class builder для данной задачи - я считаю, что вполне можно обойтись просто External Functions.
А есть где ресурсы в сети или примеры как создать DLL с External Functions и чтобы они могли работать в PB?
Да, хотелось бы передавать строчки в External DLL по ссылке - это реально сделать? :)

PS
Это мой первый опыт создания внешних ДЛЛ к моим приложениям на PB
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34367089
dGrichine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марк авторРезультат на скриншоте - ситуация усугубляется :(
Для больших строк есть более быстрые алгоритмы чем наивный поиск.

Есть где посмотреть эти "быстрые алгоритмы"? Или гуглить? :)
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34367135
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dGrichineА есть где ресурсы в сети или примеры как создать DLL с External Functions и чтобы они могли работать в PB?
Да, хотелось бы передавать строчки в External DLL по ссылке - это реально сделать? :)


1. Приложен проект на VC6.0 + PBL с Вашим примером. Насчет ресурсов в сети - не в курсе.

2. Для передачи по ссылке во внешнюю ф-ю нужно объявить параметр как ref string или readonly string, в зависимости от того собираетесь ли его модифицировать.
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34367139
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dGrichineЕсть где посмотреть эти "быстрые алгоритмы"? Или гуглить? :)
http://informatic.iatp.by/materials/shen.htm
Из этой же книжки, только выдрали кусок в реферат
http://www.refstar.ru/data/r/id.10438_1.html
А вообще, все у Кнута в 3-м томе расписано, можно и в интернете найти.
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34367164
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dGrichineЕсть где посмотреть эти "быстрые алгоритмы"? Или гуглить? :)

http://ishodniki.ru/base/alg/search1.zip
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34368361
dGrichine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky1. Приложен проект на VC6.0 + PBL с Вашим примером.

Повторил Ваш пример на Open Watcom C++ - результаты налицо - DLL из под Watcom имеет стабильно значительно меньшую производительность :( см. скриншот.
PBL намеренно не правил, разве что настроил на external function на другую ДЛЛ.

Код Open Watcom C++
Код: 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.
#include <string.h>

#ifdef __NT__
    #pragma aux __fortran "*" parm [] modify [ eax ecx edx ];
    #define PB_EXPORT      __export __fortran
#else
    #define PB_EXPORT      __pascal __export
#endif

extern "C" { 
    int PB_EXPORT pos(char *str, char *pat);
    int PB_EXPORT posn(char *str, char *pat, int n);
}

//
int PB_EXPORT pos(char *str, char *pat)  {
        char *p = strstr(str, pat);
        return p ? p - str +  1  :  0 ;
 }

// 
int PB_EXPORT posn(char *str, char *pat, int n)  {
        int r =  0 ;
        for (int i =  0 ; i < n; i ++)
                r = pos(str, pat);  
        return r;
 }

Видно придется поставить VC6.0 - поиграться с ним
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34368501
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dGrichineПовторил Ваш пример на Open Watcom C++ - результаты налицо - DLL из под Watcom имеет стабильно значительно меньшую производительность :( см. скриншот.
иех, давненько я с Ваткомом не игрался...
Но в общем результат ожидаемый. Это когда-то, в начале девяностых, Ватком был самым качественным компилятором. Но десятилетие забвения даром не проходит, конкуренты вырвались вперед.

Кстати, прикола ради, я тоже поигрался с тем кодом что Анатолий показал. Но я игрался на PB9 и разных С-плюс-плюсах.
VC6, VC2003, MinGW показали одинаковые результаты. В среднем цифры были 571/151
А вот BC5.5 (более новых борландов у меня нету, извините) даже на таком тесте тормозил: 902/418
Оптимизацию не включал нигде, вся компиляция делалсь с установками по умолчанию.
Цикл и pos на PB9 был в это время в среднем 333.
А вот dll сделаная OpenWatcom под PB9 работать отказалась. Падает с GPF на первом же вызове функции dll. Не понял пока почему.
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34368674
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dGrichineПовторил Ваш пример на Open Watcom C++ - результаты налицо - DLL из под Watcom имеет стабильно значительно меньшую производительность :( см. скриншот.

А DLL часом не в дебаг режиме скомпилена?
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34368900
dGrichine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky dGrichineПовторил Ваш пример на Open Watcom C++ - результаты налицо - DLL из под Watcom имеет стабильно значительно меньшую производительность :( см. скриншот.

А DLL часом не в дебаг режиме скомпилена?

Создавал с и без дебаг режима - результаты одни и те же.
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34369224
ZhV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автору топика.
Извините, что не быстро прореагировал на вопрос.

Суть проблемы точно изложена вот :
Anatoly MoskovskyДело в том, что достигнуть повышения производительности можно только перенеся в C++ сам алгоритм (ну или его затратную часть, например цикл).
Иначе накладные расходы на вызовы внешних фунций будут нивелировать эффект от ускорения самих функций. Особенно в таких случаях как POS().
Вы думаете внутри PB pos() реализована как-то по-другому, чем через strstr() ? Нет.
Так что в этом конкретном случае перенос ф-и в С++ саму ф-ю не ускорил, да еще и накладные расходы добавились - вот и замедлилось :)

Что же касается использования PB C++ Class builder для данной задачи - я считаю, что вполне можно обойтись просто External Functions.

Дело в том, что мне нужны были не строковые функции как таковые , а полноценный строковый парсинг элементов Describe("datawindow.syntax") - в том топике, откуда вы взяли цитату имеются некоторые детали задачи.
Этот парсинг делается в С++ гораздо быстрее (в десятки раз) чем в PB даже если в "лоб" посимвольно перебирать элементы строки обычным для Си приемам адресной арифмитеки .

К сожалению, все это делалось давно на другой работе и компе - исходники вот так сразу не нашел. Осталась только dll и обьект на PB с описаниями вызовов Может быть пороюсь еще - найду.
Определение вызовов из PB в разделе External function выглядит вот так

Код: plaintext
1.
public function long u_cppfuncf_get_equal ( ulong ThisHandle, ref string input, long position, ref long edge, ref long lenth ) library 'my_cppfun.dll'
Это функция , которая из входной строки с заданной позиции возвращает позиции левой и правой части определения обьекта .
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34369909
dGrichine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ок, буду пытаться переносить в ДЛЛ часть логики приложения.

Да..., вчера поставил фриварный компилятор Dev-C++, собрал ДЛЛ - результаты похожие на те, что описывает White Owl в 3857352
так что дальше буду играться с ним
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34369973
ZhV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 dGrichine
Не думаю что все так плохо - много логики переносить не надо.
PB довольно сильно заточен под приложения для работы с DB - в таком случае вообще
принято как можно больше логики сваливать на сервер СУБД - это оправдано и доказано
многократно.

Вот в той функции, что я привел, мне например потребовался примерно такой алгоритм
- после отработки очередной лексемы, в строке описания синтаксиса ищется очередной знак '='
- после нахождения - отматываем назад до пробела, или скобки - это есть название property
- справа - ищем конец выражения с учетом парности открывающих/закрывающих скобок и/или
кавычек...
ну и т.д. в цикле да еще с возможной рекурсией.
Кстати, потом уже я прикинул, что алгоритм не оптимален, но все уже работало и
я не стал переделывать.
Проблема в том, что таких итераций при разборе datawindow - от сотен до нескольких тысяч.
Попытка сделать это на самом PB - тормоз.

Резюме - интерфейс с С++ нужен только в местах и в той степени, когда стоит необходимость
высокой производительности низкоуровневых алгоритмов.
Подозреваю, что в задачах с реальной математикой - типа интегрирования или вероятностного
моделирования у PB будут те же проблемы. Ну так не PowerBuilder-ом единым :)


P.S. Прошу прощения - я кажется свои предыдущим постом "растащил" топик - я как-то не
подумал что строки без <CR> набранные в notepad движок форума не обрабатывает на контроль
длины строки. Ленивые сишники писали :-))
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34372340
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dGrichineДа..., вчера поставил фриварный компилятор Dev-C++, собрал ДЛЛ - результаты похожие на те, что описывает White Owl в 3857352
так что дальше буду играться с нимТолько Dev-C++ это не компилятор. Это IDE. Компилятор поставляемый с этим IDE по умолчанию - это старый добрый GNU C, в варианте MinGW.
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34425733
dGrichine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZhV

Код: plaintext
1.
2.
public function long u_cppfuncf_get_equal ( ulong ThisHandle, ref string input, &
long position, ref long edge, ref long lenth ) library 'my_cppfun.dll'
Это функция , которая из входной строки с заданной позиции возвращает
позиции левой и правой части определения обьекта .

Если не секрет, зачем в DLL передается ulong ThisHandle ?
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34425967
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dGrichineЕсли не секрет, зачем в DLL передается ulong ThisHandle ?Ну я не ZhV, что там в его исходниках находится не знаю, но отсылать в функцию хендл окна можно например для:
- функция работает асинхронно. То есть создает свою собственную нить, которая делает всю работу и выходит. А по завершении работы нить кидает в окно сообщение "готово". В функции делаешь SendMessage(ThisHandle, WM_USER, ...) а в окне ловишь pbm_custom0.
- набор из нескольких функций использует какой-то пачку статических переменных, и для каждого окна создаем свою отдельную пачку.
- Или просто для унификации. Если у тебя в библиотеке есть сотня функций требующих хендл окна, то проще сделать чтобы и десять дополнительных функций принимали хендл окна первым параметром и игнорировали. Проще писать :)
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34426158
18-я весна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dGrichine ZhV
Код: plaintext
1.
public function long u_cppfuncf_get_equal ( ulong ThisHandle, ref string input, &
long position, ref long edge, ref long lenth ) library 'my_cppfun.dll'
Это функция , которая из входной строки с заданной позиции возвращает
позиции левой и правой части определения обьекта .Если не секрет, зачем в DLL передается ulong ThisHandle ?
Это же метод класса. А нестатическим методам класса требуется ссылка на экземпляр класса.
Вот это она и есть.
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34427077
ZhV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dGrichine

Если не секрет, зачем в DLL передается ulong ThisHandle ?

Два предыдущих поста, кажется, все прояснили.

К сожалению, мои поиски исходников кончились ничем - похоже погибли безвозвратно.
Насколько я помню, в PB6 была возможность создавать UserObject класса cpp, при этом
автоматически генерился шаблон класса и передавался в среду Vatcom C++
Именно сгенерированный шаблон автоматически обьявлял Handle ссылки на самого себя.
Я просто заполнил С++ кодом предложенные шаблоны, а зачем там Handle - даже не задумывался.

И кажется именно такой подход с Handle обеспечивает стабильную работу внешних С++ функций.
В отличие от попытки создать комплект функций в виде dll на VC++ и подключиться к ней
как к внешним API-вызовам. Очень глючно работало.

Немного удивляет, почему возможность создания cpp-обьектов отстутствует в PB9.
Или я чего то не знаю
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34427114
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZhVНемного удивляет, почему возможность создания cpp-обьектов отстутствует в PB9.
Или я чего то не знаю
См. PBNI.
Это практически тоже самое.
...
Рейтинг: 0 / 0
С++ Class Builder, Увеличение производительности строковых функций
    #34427245
dGrichine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZhV
Два предыдущих поста, кажется, все прояснили.
Да, конечно. Спасибо!
ZhV
И кажется именно такой подход с Handle обеспечивает стабильную работу внешних С++ функций.
В отличие от попытки создать комплект функций в виде dll на VC++ и подключиться к ней
как к внешним API-вызовам. Очень глючно работало.

Да, нет - работают нормально, правда я не VC++ использую, а, как правильно меня поправил White Owl, "GNU C, в варианте MinGW" (Code::Blocks)

Для пробы реализовал такие функции (надеюсь из названий понятно) как
- replaceall (как регистрозависимую так и нет)
- counttoken (как регистрозависимую так и нет)
- parse2array
И эти прототипы на средних и больших объемах данных действительно работают значительно быстрее чем их аналоги на PB. На малых объемах - сравнимы с PB.

Но возникает ряд вопросов с резервированием памяти для возврата результата из функции DLL. Эти вопросы решаются путем дополнительных вызовов функций DLL, которых хотелось бы избежать. (Других путей не нашел, а они есть? :) )

Вот я и задумался о том, что мне немного не хватает вызовов просто одиночных функций, хотелось бы чтобы можно было:
1. создать объект
2. зарядить переменные
3. вызвать обработку, или несколько обработок
4. забрать значение переменных (результат)
5. корректно разрушить объект и освободить память

Дальше думаю поковыряться с классами и методами в с++, может быть это поможет избежать дублирования вызовов функций.
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / С++ Class Builder, Увеличение производительности строковых функций
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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