Превключете от STL на Microsoft към STLport

Използвам доста STL в критичен за производителността C++ код под Windows. Един възможен "евтин" начин да получите допълнителна производителност би бил да преминете към по-бърза STL библиотека.

Според тази публикация STLport е по-бърз и използва по-малко памет, но е на няколко години.

Някой направил ли е тази промяна наскоро и какви бяха вашите резултати?


person Laserallan    schedule 02.03.2009    source източник


Отговори (8)


Не съм сравнявал производителността на STLPort с MSCVC, но бих се изненадал, ако има значителна разлика. (Разбира се, в режим на освобождаване - компилациите за отстраняване на грешки вероятно ще бъдат доста различни.) За съжаление връзката, която предоставихте - и всяко друго сравнение, което съм виждал - е твърде малко по отношение на подробностите, за да бъде полезно.

Преди дори да обмислите смяна на доставчици на стандартни библиотеки, препоръчвам ви да профилирате сериозно своя код, за да определите къде са тесните места. Това е стандартен съвет; винаги профилирайте, преди да опитате подобрения на производителността!

Дори ако профилирането разкрие проблеми с производителността в стандартни библиотечни контейнери или алгоритми, бих ви предложил първо да анализирате как ги използвате. Алгоритмичните подобрения и подходящата селекция на контейнери, особено като се имат предвид големи разходи, е много по-вероятно да донесат по-голяма възвръщаемост на производителността.

person MattyT    schedule 03.03.2009
comment
Дойдох тук със същия проблем. Всъщност като се има предвид, че във VS2010 нямате карти с хеш набори и всички други неща, въведени през 2005-2007 от TR1, разликата може да бъде тази на O(1) срещу O(N).... - person ntg; 07.02.2013

Преди да направите превключването, не забравяйте да тествате MS (всъщност Dinkumware) библиотеката с проверени итератори е изключено. По някаква странна причина те са включени по подразбиране дори в версиите на версията и това прави голяма разлика, когато става въпрос за производителност.

person Nemanja Trifunovic    schedule 03.03.2009
comment
Много добра бележка, това прави сериозна разлика. Аз сам ги деактивирах, но това може да е причината да има ускорение в публикацията в блога, която споменах в публикацията си. - person Laserallan; 03.03.2009

Наскоро направихме обратната задача. Нашето приложение е C++ сървърна програма за различни платформи и е изградено на Windows с VS 2008 (x86) и на HP-UX ia64 и Linux с gcc 4.3. На всяка платформа използвахме STLport 5.1.7 като STL библиотека и Boost 1.38.

За да сравним производителността, преди известно време също изградихме нашето приложение без STLport и след това измерихме производителността.

След това на Windows производителността стана малко по-добра. Затова избрахме да спрем да използваме STLport с VS 2008 и да използваме библиотеката по подразбиране VS 2008 STL.

При HP-UX ia64 имаше 20% спад в производителността. Caliper (профилистът HP-UX) показа, че присвояването на низове отнема повече време. И вътре в присвояването на низове в gcc STL библиотеката по подразбиране имаше извиквания към pthread_mutex_unock. Доколкото знам, се използват pthread_mutex_lock/pthread_mutex_unlock, тъй като STL библиотеката на gcc по подразбиране използва COW-низове. В нашето приложение правим много присвоявания на низове и в резултат на низовете COW получаваме по-лоша производителност. Така че все още използваме STLPort на HP-UX с gcc.

person Community    schedule 04.06.2010

В проект, върху който работих, който използва доста интензивно stl, преминаването към STLport доведе до свършване на нещата за половината от времето, необходимо за изпълнението на STL на Microsoft. Не е доказателство, но е добър знак за ефективност, предполагам. Вярвам, че отчасти се дължи на усъвършенстваната система за управление на паметта на STLport.

Спомням си, че получих някои предупреждения, когато направих тази промяна, но нищо, което не можеше да бъде заобиколено бързо. Като недостатък бих добавил, че отстраняването на грешки с STLport е по-малко лесно с дебъгера на Visual Studio, отколкото с STL на Microsoft (Актуализация: изглежда има начин да се обясни на дебъгера как да се справят с контейнерите на STLport, благодаря Jalf!).

Последната версия е от октомври 2008 г., така че все още има хора, които работят по нея. Вижте тук за изтеглянето му.

person Benoît    schedule 03.03.2009
comment
Относно отстраняването на грешки, не е ли това просто въпрос на настройка на правилните визуализатори за дебъгера? stlport.svn.sourceforge.net/ viewvc/stlport/trunk/STLport/etc/ - person jalf; 03.03.2009
comment
Можете ли да определите количествено вашата оферта за половината време? Правилно ли приемам, че сте използвали версия за версия? Какво правеше? - person MattyT; 03.03.2009
comment
Това беше статията, а не STLport, която беше на няколко години. - person Laserallan; 03.03.2009
comment
Работех върху алгоритъм на графика (използвайки Boost.Graph, който сам по себе си използва stl). Итерирах през върхове и ръбове, конструирах списъци с елементи, които отговарят на критерий, итерирах през тези списъци... Времето за изпълнение премина от 17 секунди на 8. Разбира се, това беше компилация за версия. - person Benoît; 03.03.2009
comment
Съжалявам, Laserallan, не бях разбрал тази част от въпроса ви. - person Benoît; 03.03.2009

Аз направих точно обратното преди година и ето защо:

  • StlPort се актуализира много рядко (доколкото знам само един разработчик работи върху него, можете да погледнете тяхната история)
  • Проблеми при изграждането му всеки път, когато преминете към нова версия на Visual Studio. Изчаквате новия make файл или го създавате сами, но понякога не можете да го изградите поради някои опции за конфигурация, които използвате. След това чакате да го накарат да се построи.
  • Когато изпратите доклад за грешка, вие чакате цяла вечност, така че по същество няма поддръжка (може би ако платите). Обикновено в крайна сметка го поправяте сами, ако знаете как.
  • STL във Visual Studio има проверени итератори и поддръжка на итератор за отстраняване на грешки, която е много по-добра от този в StlPort. Това е мястото, където идва по-голямата част от забавянето, особено при отстраняване на грешки. Проверените итератори са активирани както при отстраняване на грешки, така и при освобождаване и това не е нещо, което всеки знае (трябва сами да ги деактивирате).
  • STL във Visual Studio 2008 SP1 идва с TR1 и нямате това в StlPort
  • STL във Visual Studio 2010 използва препратки към rvalue от C++0x и това е мястото, където получавате истинска полза от производителността.
person Nikola Smiljanić    schedule 18.09.2010

Ако използвате STLPort, ще влезете в свят, в който всяка STL-базирана библиотека на трета страна, която използвате, ще трябва да бъде прекомпилирана със STLPort, за да се избегнат проблеми...

STLPort има различна стратегия за памет, но ако това е вашето тясно място, тогава вашият път за увеличаване на производителността е промяна на разпределителя (превключване към Hoard например), а не промяна на STL.

person Edouard A.    schedule 03.03.2009
comment
stlport може да бъде конфигуриран да се използва заедно с stl. Това просто означава, че трябва да бъдете по-съзнателни при използването му, вместо да бъде просто капка в замяната. - person 0xC0DEFACE; 03.03.2010

Не съм го пробвал, но доколкото знам, няма големи промени в реализацията на STL на Microsoft. (В компилатора VS2008 също няма огромни нови оптимизации през 2005 г.) Така че, ако STLPort беше по-бърз тогава, вероятно все още е така.

Но това са само спекулации. :) Не забравяйте да докладвате за резултатите, ако го изпробвате.

person jalf    schedule 02.03.2009

Едно предимство на stlport е, че е с отворен код.

person Rodyland    schedule 03.03.2009
comment
вярно, но не релевантно на въпроса - person 0xC0DEFACE; 03.03.2010
comment
Чудя се как изобщо бихте могли да създадете STL реализация със затворен код - person jalf; 05.06.2010
comment
Толкова лесно, колкото просто да не добавяте лиценз с отворен код към заглавните файлове. Не забравяйте, че отвореният код се отнася до лицензирането, а не до това дали можете да прочетете източника или не... - person Benj; 12.04.2011
comment
Не е вярно, Бендж. OpenSource означава това, което звучи: източникът е достъпен. Това, което вероятно имате предвид, се нарича свободен софтуер или свободен като свобода на словото. - person libeako; 01.08.2011