|
С++ Class Builder, Увеличение производительности строковых функций
|
|||
---|---|---|---|
#18+
Народ, кто пользовался С++ 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.
код С++ Код: 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.
Код 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.
Результаты работы в скрине ниже - циклов 100000, получается, что POS работает в 3 раза быстрее, неужели, что С++ при таком использовании настолько медленнее? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2007, 11:42 |
|
С++ Class Builder, Увеличение производительности строковых функций
|
|||
---|---|---|---|
#18+
dGrichineНарод, кто пользовался С++ Class Builder, подскажите где грабли? Почему результаты противоположные? использую PB 6.5.1 ... Хотелось бы посмотреть на результаты для строк приличной длины, символов так на несколько сотен, несколько тысяч. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2007, 12:56 |
|
С++ Class Builder, Увеличение производительности строковых функций
|
|||
---|---|---|---|
#18+
dGrichineа зачем после ichk = false; продолжать крутить цикл? ;-) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2007, 13:01 |
|
С++ Class Builder, Увеличение производительности строковых функций
|
|||
---|---|---|---|
#18+
ЗоринАндрей Хотелось бы посмотреть на результаты для строк приличной длины, символов так на несколько сотен, несколько тысяч.[/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.
Результат на скриншоте - ситуация усугубляется :( В чем же дело? Может не надо использовать класс билдер а писать с нуля DLL на Watcom C++? Хотя в объявлениях пользовательского объекта унаследованного from cplusplus класса идут такие же объявления на внешние функции из ДЛЛ... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2007, 13:44 |
|
С++ Class Builder, Увеличение производительности строковых функций
|
|||
---|---|---|---|
#18+
Дело в том, что достигнуть повышения производительности можно только перенеся в C++ сам алгоритм (ну или его затратную часть, например цикл). Иначе накладные расходы на вызовы внешних фунций будут нивелировать эффект от ускорения самих функций. Особенно в таких случаях как POS(). Вы думаете внутри PB pos() реализована как-то по-другому, чем через strstr() ? Нет. Так что в этом конкретном случае перенос ф-и в С++ саму ф-ю не ускорил, да еще и накладные расходы добавились - вот и замедлилось :) Что же касается использования PB C++ Class builder для данной задачи - я считаю, что вполне можно обойтись просто External Functions. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2007, 14:38 |
|
С++ Class Builder, Увеличение производительности строковых функций
|
|||
---|---|---|---|
#18+
авторРезультат на скриншоте - ситуация усугубляется :( Для больших строк есть более быстрые алгоритмы чем наивный поиск. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2007, 14:52 |
|
С++ Class Builder, Увеличение производительности строковых функций
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyЧто же касается использования PB C++ Class builder для данной задачи - я считаю, что вполне можно обойтись просто External Functions. А есть где ресурсы в сети или примеры как создать DLL с External Functions и чтобы они могли работать в PB? Да, хотелось бы передавать строчки в External DLL по ссылке - это реально сделать? :) PS Это мой первый опыт создания внешних ДЛЛ к моим приложениям на PB ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2007, 15:02 |
|
С++ Class Builder, Увеличение производительности строковых функций
|
|||
---|---|---|---|
#18+
Локшин Марк авторРезультат на скриншоте - ситуация усугубляется :( Для больших строк есть более быстрые алгоритмы чем наивный поиск. Есть где посмотреть эти "быстрые алгоритмы"? Или гуглить? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2007, 15:07 |
|
С++ Class Builder, Увеличение производительности строковых функций
|
|||
---|---|---|---|
#18+
dGrichineА есть где ресурсы в сети или примеры как создать DLL с External Functions и чтобы они могли работать в PB? Да, хотелось бы передавать строчки в External DLL по ссылке - это реально сделать? :) 1. Приложен проект на VC6.0 + PBL с Вашим примером. Насчет ресурсов в сети - не в курсе. 2. Для передачи по ссылке во внешнюю ф-ю нужно объявить параметр как ref string или readonly string, в зависимости от того собираетесь ли его модифицировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2007, 15:19 |
|
С++ Class Builder, Увеличение производительности строковых функций
|
|||
---|---|---|---|
#18+
dGrichineЕсть где посмотреть эти "быстрые алгоритмы"? Или гуглить? :) http://informatic.iatp.by/materials/shen.htm Из этой же книжки, только выдрали кусок в реферат http://www.refstar.ru/data/r/id.10438_1.html А вообще, все у Кнута в 3-м томе расписано, можно и в интернете найти. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2007, 15:19 |
|
С++ Class Builder, Увеличение производительности строковых функций
|
|||
---|---|---|---|
#18+
dGrichineЕсть где посмотреть эти "быстрые алгоритмы"? Или гуглить? :) http://ishodniki.ru/base/alg/search1.zip ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2007, 15:27 |
|
С++ Class Builder, Увеличение производительности строковых функций
|
|||
---|---|---|---|
#18+
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.
Видно придется поставить VC6.0 - поиграться с ним ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2007, 21:57 |
|
С++ Class Builder, Увеличение производительности строковых функций
|
|||
---|---|---|---|
#18+
dGrichineПовторил Ваш пример на Open Watcom C++ - результаты налицо - DLL из под Watcom имеет стабильно значительно меньшую производительность :( см. скриншот. иех, давненько я с Ваткомом не игрался... Но в общем результат ожидаемый. Это когда-то, в начале девяностых, Ватком был самым качественным компилятором. Но десятилетие забвения даром не проходит, конкуренты вырвались вперед. Кстати, прикола ради, я тоже поигрался с тем кодом что Анатолий показал. Но я игрался на PB9 и разных С-плюс-плюсах. VC6, VC2003, MinGW показали одинаковые результаты. В среднем цифры были 571/151 А вот BC5.5 (более новых борландов у меня нету, извините) даже на таком тесте тормозил: 902/418 Оптимизацию не включал нигде, вся компиляция делалсь с установками по умолчанию. Цикл и pos на PB9 был в это время в среднем 333. А вот dll сделаная OpenWatcom под PB9 работать отказалась. Падает с GPF на первом же вызове функции dll. Не понял пока почему. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2007, 01:18 |
|
С++ Class Builder, Увеличение производительности строковых функций
|
|||
---|---|---|---|
#18+
dGrichineПовторил Ваш пример на Open Watcom C++ - результаты налицо - DLL из под Watcom имеет стабильно значительно меньшую производительность :( см. скриншот. А DLL часом не в дебаг режиме скомпилена? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2007, 11:29 |
|
С++ Class Builder, Увеличение производительности строковых функций
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky dGrichineПовторил Ваш пример на Open Watcom C++ - результаты налицо - DLL из под Watcom имеет стабильно значительно меньшую производительность :( см. скриншот. А DLL часом не в дебаг режиме скомпилена? Создавал с и без дебаг режима - результаты одни и те же. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2007, 15:30 |
|
С++ Class Builder, Увеличение производительности строковых функций
|
|||
---|---|---|---|
#18+
Автору топика. Извините, что не быстро прореагировал на вопрос. Суть проблемы точно изложена вот : Anatoly MoskovskyДело в том, что достигнуть повышения производительности можно только перенеся в C++ сам алгоритм (ну или его затратную часть, например цикл). Иначе накладные расходы на вызовы внешних фунций будут нивелировать эффект от ускорения самих функций. Особенно в таких случаях как POS(). Вы думаете внутри PB pos() реализована как-то по-другому, чем через strstr() ? Нет. Так что в этом конкретном случае перенос ф-и в С++ саму ф-ю не ускорил, да еще и накладные расходы добавились - вот и замедлилось :) Что же касается использования PB C++ Class builder для данной задачи - я считаю, что вполне можно обойтись просто External Functions. Дело в том, что мне нужны были не строковые функции как таковые , а полноценный строковый парсинг элементов Describe("datawindow.syntax") - в том топике, откуда вы взяли цитату имеются некоторые детали задачи. Этот парсинг делается в С++ гораздо быстрее (в десятки раз) чем в PB даже если в "лоб" посимвольно перебирать элементы строки обычным для Си приемам адресной арифмитеки . К сожалению, все это делалось давно на другой работе и компе - исходники вот так сразу не нашел. Осталась только dll и обьект на PB с описаниями вызовов Может быть пороюсь еще - найду. Определение вызовов из PB в разделе External function выглядит вот так Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2007, 22:14 |
|
С++ Class Builder, Увеличение производительности строковых функций
|
|||
---|---|---|---|
#18+
ок, буду пытаться переносить в ДЛЛ часть логики приложения. Да..., вчера поставил фриварный компилятор Dev-C++, собрал ДЛЛ - результаты похожие на те, что описывает White Owl в 3857352 так что дальше буду играться с ним ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2007, 21:18 |
|
С++ Class Builder, Увеличение производительности строковых функций
|
|||
---|---|---|---|
#18+
2 dGrichine Не думаю что все так плохо - много логики переносить не надо. PB довольно сильно заточен под приложения для работы с DB - в таком случае вообще принято как можно больше логики сваливать на сервер СУБД - это оправдано и доказано многократно. Вот в той функции, что я привел, мне например потребовался примерно такой алгоритм - после отработки очередной лексемы, в строке описания синтаксиса ищется очередной знак '=' - после нахождения - отматываем назад до пробела, или скобки - это есть название property - справа - ищем конец выражения с учетом парности открывающих/закрывающих скобок и/или кавычек... ну и т.д. в цикле да еще с возможной рекурсией. Кстати, потом уже я прикинул, что алгоритм не оптимален, но все уже работало и я не стал переделывать. Проблема в том, что таких итераций при разборе datawindow - от сотен до нескольких тысяч. Попытка сделать это на самом PB - тормоз. Резюме - интерфейс с С++ нужен только в местах и в той степени, когда стоит необходимость высокой производительности низкоуровневых алгоритмов. Подозреваю, что в задачах с реальной математикой - типа интегрирования или вероятностного моделирования у PB будут те же проблемы. Ну так не PowerBuilder-ом единым :) P.S. Прошу прощения - я кажется свои предыдущим постом "растащил" топик - я как-то не подумал что строки без <CR> набранные в notepad движок форума не обрабатывает на контроль длины строки. Ленивые сишники писали :-)) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2007, 22:44 |
|
С++ Class Builder, Увеличение производительности строковых функций
|
|||
---|---|---|---|
#18+
dGrichineДа..., вчера поставил фриварный компилятор Dev-C++, собрал ДЛЛ - результаты похожие на те, что описывает White Owl в 3857352 так что дальше буду играться с нимТолько Dev-C++ это не компилятор. Это IDE. Компилятор поставляемый с этим IDE по умолчанию - это старый добрый GNU C, в варианте MinGW. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2007, 18:28 |
|
С++ Class Builder, Увеличение производительности строковых функций
|
|||
---|---|---|---|
#18+
ZhV Код: plaintext 1. 2.
позиции левой и правой части определения обьекта . Если не секрет, зачем в DLL передается ulong ThisHandle ? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2007, 18:47 |
|
С++ Class Builder, Увеличение производительности строковых функций
|
|||
---|---|---|---|
#18+
dGrichineЕсли не секрет, зачем в DLL передается ulong ThisHandle ?Ну я не ZhV, что там в его исходниках находится не знаю, но отсылать в функцию хендл окна можно например для: - функция работает асинхронно. То есть создает свою собственную нить, которая делает всю работу и выходит. А по завершении работы нить кидает в окно сообщение "готово". В функции делаешь SendMessage(ThisHandle, WM_USER, ...) а в окне ловишь pbm_custom0. - набор из нескольких функций использует какой-то пачку статических переменных, и для каждого окна создаем свою отдельную пачку. - Или просто для унификации. Если у тебя в библиотеке есть сотня функций требующих хендл окна, то проще сделать чтобы и десять дополнительных функций принимали хендл окна первым параметром и игнорировали. Проще писать :) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2007, 20:52 |
|
С++ Class Builder, Увеличение производительности строковых функций
|
|||
---|---|---|---|
#18+
dGrichine ZhV Код: plaintext 1.
позиции левой и правой части определения обьекта .Если не секрет, зачем в DLL передается ulong ThisHandle ? Это же метод класса. А нестатическим методам класса требуется ссылка на экземпляр класса. Вот это она и есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2007, 23:50 |
|
С++ Class Builder, Увеличение производительности строковых функций
|
|||
---|---|---|---|
#18+
dGrichine Если не секрет, зачем в DLL передается ulong ThisHandle ? Два предыдущих поста, кажется, все прояснили. К сожалению, мои поиски исходников кончились ничем - похоже погибли безвозвратно. Насколько я помню, в PB6 была возможность создавать UserObject класса cpp, при этом автоматически генерился шаблон класса и передавался в среду Vatcom C++ Именно сгенерированный шаблон автоматически обьявлял Handle ссылки на самого себя. Я просто заполнил С++ кодом предложенные шаблоны, а зачем там Handle - даже не задумывался. И кажется именно такой подход с Handle обеспечивает стабильную работу внешних С++ функций. В отличие от попытки создать комплект функций в виде dll на VC++ и подключиться к ней как к внешним API-вызовам. Очень глючно работало. Немного удивляет, почему возможность создания cpp-обьектов отстутствует в PB9. Или я чего то не знаю ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2007, 12:22 |
|
С++ Class Builder, Увеличение производительности строковых функций
|
|||
---|---|---|---|
#18+
ZhVНемного удивляет, почему возможность создания cpp-обьектов отстутствует в PB9. Или я чего то не знаю См. PBNI. Это практически тоже самое. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2007, 12:30 |
|
С++ Class Builder, Увеличение производительности строковых функций
|
|||
---|---|---|---|
#18+
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. корректно разрушить объект и освободить память Дальше думаю поковыряться с классами и методами в с++, может быть это поможет избежать дублирования вызовов функций. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2007, 13:01 |
|
|
start [/forum/topic.php?fid=15&msg=34369909&tid=1335133]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
11ms |
get forum data: |
1ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 137ms |
0 / 0 |