[megoldva] PHP-ből C++

 ( szz | 2011. augusztus 14., vasárnap - 9:56 )

Néhány hónapja írtam egy nagyobb lélegzetű parancssori PHP programot, amely órákig fut. Nemrégiben rákerestem, át lehet-e konvertálni PHP programokat C/C++-ba. A php2cpp projekt halottnak tűnik, de van egy BinaryPHP is, aminek a csv változata egész használható. A program szerzője még mysql utasításokat is megfeleltetett C++ kódrészleteknek. Maga az ötlet zseniálisnak tűnik számomra, ahogy "mindenízű változó" típusaként létrehozza a php_var* típust. És tanulságos lehet pl. egy explode megvalósítás C++ban (lásd a functions alkönytárban; http://binaryphp.cvs.sourceforge.net/viewvc/binaryphp/?view=tar )

Pl egy tömb 4 elemének (1,2,3,4) a megszámlálásából (count) keletkezett ez:
http://pastebin.com/RkCptrLw

Ez már szépen lefordul. Bonyolultabb programok még elhasalnak.

A tuti megoldás, amivel a FaceBook PHP hátterét is optimalizálták, ez: https://github.com/facebook/hiphop-php/wiki/Running-HipHop - http://developers.facebook.com/blog/post/358 ; a hip-hop azonban csak 64 biten fut.

A 32 bitesről 64 bites oprendszerre való átállás már önmagában is tetemes előnnyel járt (a futásidő a kétharmadára csökkent; bár ebben néhány egyéb optimalizálás és adatcsökkenés is érvényesül).

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Biztos, hogy a php lassusaga miatt tart ilyen sokat, es nem pl. a db lekerdezesek miat..?

----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"

Nem használok adatbázist - előre leválogatom szövegfájlokba az adatokat. String-illesztések serege zajlik ennyi ideig (az eredeti PHP programban; nem abban, amiből a fenti részlet lett).

Ebben az esetben inkabb az algoritmust nezd at! A stringkezeles PHP-ben viszonylag jol meg van oldva, C++-szal nem nyersz sokat, max. a modosithatosag csokken (scriptnyelvbol generalt C++ kodot lass at :) ).

--
Tudod te, mennyi lóvé fér egy Alstom-kocsi dobozába? :)) - laspalmas, VB

+1

Szinte kizártnak tartom, hogy maga a PHP a hibás. Tervezésbeli vagy megvalósításbeli probléma lesz ott, esetleg külső tényező. Amennyiben high-end alkalmazásokat fejlesztesz és PHP guru vagy, természetesen a hozzászólásom nem érvényes :)

Nem "hibás" a PHP, csak egyszerűen irdatlanul sok adat van. Gyorsabb lenne a C++ minden bizonnyal.

Ha sok és nagy tömböt használsz, akkor ez lehet oka a lassúságnak. Nézd meg az SPL adatszerkezeteket, hátha segítenek. Mindenképpen futtass valami profilingot rá, mert ami PHP-ban lassú, az nem lesz nagyságrendekkel gyorsabb C-ben sem, max egész számú szorzóval. Ezzel szemben sokkal több meló karban tartani.

Sokat tanultam az SPL adatszerkezetek tanulmányozásával, de sajnos nem gyorsított a használatuk. Köszi mindenesetre - legközelebbi programjaimban már ezekre is tudok építeni.

Ez esetben lehet jobban jarnal, ha tarolt eljarast irnal, es hagynad hogy a DB futtassa, ne a webszerver. Szinte minden sql szerver termek tamogat meg regexpet is, es mar akar mysql-ben is vannak kurzorok :-)
A te szovegfajlod tuti nincs indexelve, se ugy bufferelve, hogy optimalisan kihasznald azt.

Bar jo lenne tobb info arrol, hogy mi a bemenet es mi a kivant eredmeny.

--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.

> "String-illesztések serege zajlik"

Lehet, hogy valami holisztikusabb megoldás kellene egyesével illesztett stringek helyett.

Mégiscsak ez lett a jövő útja... pedig eleinte riasztónak tűnt. :-) Köszönet a linkért.

Ez is annyira szívhezszóló (s minden lépése működőképes): https://github.com/facebook/hiphop-php/wiki/Building-and-Installing-on-Ubuntu-11.04

Igazából csak 64 bites rendszeren sikerült beüzemelni, 32 bitesen nem.

a 459. sor utan van egy beagyazott for ciklus is, a key/2-es ciklusban.

Illetve azért, mert az asssociatív tömbnél is van int indexelés, tehát [0], [alma] és [1], [béla] páronként ugyanaz, remélem nem kell teljes kódot írnom példának. Ekkor ha végigpörögsz minden elemen, akkor 2x dolgoznál fel mindent.

--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.

Köszi! :-)

Mielőtt bármit gépi kódra kezdesz konvertálni, szerintem vedd elő az xdebugot és generáltass vele cachegrind fájlt, majd elemezd ki. Olyan bakikra derülhet fény, amik miatt szükségtelen lesz az egész móka.

Subscrible.

Köszönöm a tanácsaitokat, megfontolom őket, és visszajelzek pár héten belül (most szabadságon vagyok). A fenti példa fejlesztői változata lefordult gépi kódra. :-)

Szinte biztos, hogy az algoritmusnak van 1-2 "központi" része, ami a sok al-al-al-cikluson belül fut. Ezt vagy ezeket érdemes lehet C-ben megírt PHP modulként használni. Nem nagy ördöngösség egyébként, simán lehet függvényneveket deklarálni a C kódban, amit aztán PHP-ben függvényként meg tudsz hívni.

Köszi! Igen, erről már itt is kérdezősködtem, s Kübi sikerrel meg is oldotta a dolgot SWIG-gel: http://hup.hu/node/99598 - ebben a konkrét esetben azonban olyan sok nagy tömbhöz kell kinyúlkálni a belső ciklusmagból, hogy nem volt bátorságom modult írni hozzá.