Viedumu Vietne ar Sandi

2009-07-14

Atvērts jautājums programmētājiem

Filed under: Tech — Sandis @ 19:41

Sākšu ar priekšvārdu. Jau sen pūlos pie viena no savu brīvā laika projektu – VFFL – pabeigšanas. Programmkods pamatā tiek rakstīts PHP un datubāze turēta MySQL kopā ar procedūrām. Šobrīd esmu pamatīgi iesēdies uz veiktspējas problēmas – ir nepieciešams palaist algoritmu futbola spēles simulēšanai. PHP rakstīto kodu var piespiest palaist komandrindā, taču tas strādā lēni un neliekas īsti uzticama vide spēļu simulēšanai. Pati spēļu simulēšana sastāv no vairāku klašu izsaukšanas (pašas simulācijas un maza AI kārtības nodrošināšanai) un savienošanās ar datubāzi datu saņemšanai un nosūtīšanai.

Tāpēc es sāku skatīties uz simulācijas koda pārnešanu uz C++ (sintakses līdzība ar PHP veicinās ātrāku pāreju). Bināri izpildāms fails nodrošinās ātrāku izpildāmības laiku, necietīs no iespējas izbeigties noilguma dēļ un veiks optimālāku vēršanos pie atmiņas, nevis kods tiks parsēts caur PHP, tad izpildīts. Tas viss būtu labi, bet kā ar vēršanos pie datubāzes?

Tā dēļ vēršos ar šo ierakstu pie plašākas auditorijas, meklējot cilvēkus, kam ar šo varētu būt pieredze – ar kādu draiveri/bibliotēku ir ērtāk strādāt un kuru ir visērtāk instalēt. Vide, kurā programma darbosies, ir FreeBSD 6.x – 7.x, palaista no komandrindas un/vai crontaba.

Esmu veicis arī mazu izpētes darbu kādas bibliotēkas eksistē un atradu 3 variantus:
– MySQL++ (http://tangentsoft.net/mysql++/)
– Connector/C++ (http://dev.mysql.com/downloads/connector/cpp/1.0.html)
– ODBC

Sāku ar MySQL++, kuru mēģināju uzlikt kā DevPaku Dev-C++ Windows vidē, tā rpm pakotni uz Centos 5 (pieejama testsistēma). Diemžēl, Windows vidē metās dažādas kļūdas kompilējot testpiemērus. Meklējot gūglē atradu, ka nav normālas atbildes un ir vēl citi cilvēki, kas par tām ir interesējušies. Kompilējot testpiemērus uz linux arī līdzīga situācija, tikai šoreiz bija neviennozīmīgākas kļūdas, kuras Google neatrada. No viena padoma sapratu tikai, ka tur varbūt ir kautkāda nesaderība bibliotēkām.

Turpināju ar MySQL taisīto Connector/C++, kurš, uz Linux, vismaz nokompilējās ar minimālāko testpiemēru, bet palaižoties sāka mētāties ar dažādiem krekšķiem “namespace: command not found”, “`extern void *memcpy (void *__restrict __dest,'” utt. Tātad arī šeit radās problēmas, lai gan MySQL vismaz ir smuki iedevuši sadalītus failus tieši RedHatam un FreeBSD (kā arī Solaris, HP-UX, MacOS, utt).

Te nu es nonācu neizpratnē – ir speciāli sagatavotas bibliotēkas savienojuma veikšanai, taču tās ir pietiekami specifiski uzstādāmas, ka ar pāris stundām (priekš manis) nepietika.

ODBC ir ODBC, es to vēl neesmu mēģinājis un skatījis, jo zinu ka tas ir universāls pieslēguma veicējs, taču nav speciāli orientēts MySQL.

Vai kāds zin vēl kādu variantu vai arī var izteikties par augstākminētā saraksta praktiskās lietošanas plusiem?

27 komentāri »

  1. MySQL C API – http://dev.mysql.com/doc/refman/5.0/en/c.html
    viss kompileejaas/straadaa bez saapeem un taa
    sintakse +- liidziiga tai kaa ar php straadaa

    Komentārs by vdl — 2009-07-14 @ 14:29

    • paldies, šitas izskatās dzīvotājs, jo automātiski nāk līdz pašai datubāzei. tagad urbjos cauri viņu piemēriem (kas gan nav īpaši uzskatāmi, jo ir pats mysql source kods)

      Komentārs by Sandis — 2009-07-14 @ 15:08

      • Nodarbojas te ar blakuslietām darba laikā😛

        Komentārs by salviz — 2009-07-14 @ 17:22

  2. 1. Ja pašas procedūras ir garas, (cik saprotu tas ir tavs variants) – tad C++ nepalīdzēs.
    2. Laist no komandrindas procedūras nav nekas slikts.

    Grūti saprast, par ko tieši tu runā, bet es ieteiktu izmantot loģisko kešošanu. Tobiš, laižot kaut kādas procedūras, censties darīt visu lai vienu un to pašu aprēķinu neveiktu vairākkārt. Vari izmantot Mysql DB tipu Memory, kas strādā RAMā un priekš kešošans/pagaidu datiem ir ideāli piemērots.

    Pagaidām tas ko tu raksti izklausās pēc draugiem.lv problēmām, kad viņi tiko parādījās. Es vēl atceros paziņojumu “Pagājušās naktī OS maiņa nav devusi vēlamo rezultātu, tāpēc meklēsim citus risinājumus”

    Meklē risinājumu optimizācijā nevis tehnoloģijā.
    Cheers

    Komentārs by ramm2 — 2009-07-14 @ 14:56

    • Es izmantoju MySQL procedūras, bet šajā gadījumā bija domātas PHP procedūras (kuras ik pa laikam izsauc arī MySQL pieprasījumus). Drošvien, ka PHP procedūras mēģināt iebāzt MySQL operatīvajā atmiņā nebūtu prāta darbs.

      Komentārs by Sandis — 2009-07-14 @ 15:07

      • ..nu domāju, ka tas nebūtu arī iespējams.

        Nu tad konkrēti, kas ir tas ko tu dari ar PHP?

        Komentārs by ramm2 — 2009-07-14 @ 15:13

      • Izsaucu klasi, kas savāc datus un vajadzības gadījumā uzģenerē vajadzīgo ievadu priekš spēles. Tad tiek rīkota spēle, kas savā ziņā ir liels randoma ģenerēšanas un ievaddatu pārskaitīšanas cikls ar dažādām apakšprocedūrām (vairāk randoma ģenerēšanas). Pēcapstrāde ir uzģenerēto datu saglabāšana.

        Problēma ir tāda, ka nemitīgā datu pārskaitīšana un randoma ģenerēšana (kas nav standarta rand(x,y)) kopā ar ievaddatu nolasīšanu un ierakstīšanu vismaz uz testdatora ļoti ilgi ģenerējas un beidzas ar koda uzkāršanos. izsaucot kodu caur apache kā lapu, noķeras execution timeout. paspēj uzģenerēt 5 spēles, kas ir nenopietni, ja vajag vismaz 30+.

        Komentārs by Sandis — 2009-07-14 @ 15:21

  3. Nu execution timeout jau var mainit, ne jau tur tā problēma.

    Pamēģini pamērīt laikus, kas ir tas, kas kavē. Ja viss
    beidzas ar skripta uzkāršanos, tad iespējams tev ir kļūdas pēc radusies rekursija.

    Nopienti, C++ nav risinājums. Uz PHP parsēšanu tu zaudēsi milisekundi, uz to ka C++ optimālāk izmanto atmiņu iegūsi labākajā gadījumā 5%.

    Mans verdikts, vai nu esi “sapisies meistarībā” No Offence🙂, vai arī tev ir kļūda.

    Komentārs by ramm2 — 2009-07-14 @ 15:26

    • viss kārtībā, tādu versiju arī pats neesmu izslēdzis. laikus arī esmu mērījis, itkā viss normāli – aptuveni 5 reizes pēc kārtas taču viss sekmīgi pabeidzās😉 varētu arī būt, ka atmiņa kautkur netiek atbrīvota.

      Komentārs by Sandis — 2009-07-14 @ 15:30

  4. varbūt tas izklausās stulbi, bet vai esi lietas kursā, ka php konfigā, var norādīt maksimālo atļauto atmiņas daudzumu, ko PHP engine drīkst lietot ? Un by default tas nav lieks.
    Varbūt tiešām mem ir par maz.

    2.kārt, ir vēl tāds variants – ja tev tiešām ir kautkāda f-cija kas briesmīgi kaut ko rēķina, vari taču uztaisīt atsevišķi tikai to f-ciju iekš C++. No PHP nodod datus, un pēc tam saņem…..Nav obligāti čakrēties ar C++ pieslēgšanu Mysql
    [code]

    [code]

    Komentārs by ramm2 — 2009-07-14 @ 15:41

    • esmu lietas kursā par php konfigu, izpildes laiku, atmiņas daudzumiem, utt. (esmu arī palielinājis, taču ne bezgalīgi).

      arī variants. tikai vai nesanāks lielāks čakars – randoma īpašais rēķinātājs ir viens, bet dažas funkcijas to izsauc rēķināt vairākas reizes. kas noved pie nepārtrauktas vēršanās pie šī randoma rēķinātāja ar datu padošanu. pārējie pārrēķināmie ievaddati atrodas datu struktūrā, kuru tāpat vien nepadosi, bet atsevišķi tad jāraksta daudz rēķinātāji, tā ka arī grūti pārnest. man vairāk liekas, ka atstāt vienā vidē visu ir labāk, nekā sadalīt.

      Komentārs by Sandis — 2009-07-14 @ 15:48

  5. 😀 WP norija manu kodu
    es rakstīju šitā:

    “$dati = system(‘./manacpp-fcija $input1 $input2 $inpu-N’);”

    Komentārs by ramm2 — 2009-07-14 @ 15:42

  6. Iesaku izmantot XDebug profileri un saprast, kas bremzē.

    Komentārs by Kristaps Kūlis — 2009-07-14 @ 17:59

  7. To, ko Kristaps teica.

    Komentārs by weedy — 2009-07-14 @ 18:29

  8. Es gan nezinu, kas tam tavam algoritmam tāds būtu jārēķina, lai rastos veiktspējas problēmas.
    Bet enivei – kam vajadzīgs PHP, kam vajadzīgs C++, ja ir izgudrota Java?

    Un vēl, paskaties viena vella zeļļa futbola simulatoru – http://home.lanet.lv/~sd10104/futbols.rar
    Varbūt var pasmelties ideju algoritma optimizēšanai.

    Komentārs by Zandis — 2009-07-15 @ 9:18

    • Es pat zinu, kas šo ir taisījis.

      Komentārs by OreMan — 2009-07-15 @ 9:56

      • bļe, kaut nu es zinātu kas to ir taisījis. kruts esi.

        Komentārs by Jancis — 2009-07-20 @ 15:52

    • Man jau šo spēli ir rādījuši. Diemžēl tā ir balstīta uz 9pret 9 “spēlētāju” skriešanu pakaļ bumbai līdzīgi kā to dara mazi bērni. Kā futbola simulācija un iespējami attīstāma spēle tā ir nebaudāma. Tomēr visu cieņu Mārtiņam Možeiko, kas to ir radījis. Iespējams, ka izstudējot spēli cītīgāk, to ir iespējams pielāgot vai pārvērst par kautko baudāmāku.

      Komentārs by Sandis — 2009-07-20 @ 16:24

  9. taatad taa.

    cepam aukshaa futbola api ieksh c++. vinjam vajadzeetu aciimredzot griezties visu laiku kaa “serverim”, kas skatiitos vai ir kaada speele vai nav. koliidz secina ka jauna speele “jaavada”, taa palaizham jaunu threadu kursh tieshi to arii dariis un viss buus forshi. ieksh php ar threadeim buus probleemas. un taalaak jau visu nosaka cik ram/cpu pieejams un cik efektiivs ir tavs ai

    Komentārs by veciic — 2009-07-15 @ 11:34

  10. taatad taa.

    cepam aukshaa futbola api ieksh java. vinjam vajadzeetu aciimredzot griezties visu laiku kaa “serverim”, kas skatiitos vai ir kaada speele vai nav. koliidz secina ka jauna speele “jaavada”, taa palaizham jaunu threadu kursh tieshi to arii dariis un viss buus forshi. ieksh php ar threadeim buus probleemas. un taalaak jau visu nosaka cik ram/cpu pieejams un cik efektiivs ir tavs ai

    Komentārs by Zandis — 2009-07-15 @ 11:49

  11. Pisec, Zandi, tu varētu nepist prātu un visur sākt izmantot vienu internāta identitāti, savādāk rodas grūti pārvarāma vēlme veltīt tev nepārāk glaimojošus izteicienus šai sakarā.

    Komentārs by me — 2009-07-15 @ 12:58

  12. nepārvari

    Komentārs by Zandis — 2009-07-15 @ 16:14

  13. Piekrītu, ka jāizvēlas Java🙂
    Neko daudz tu tajā C++ nesataupīsi. Java var daudz labāk realizēt kešošanu, statiskos mainīgos, ko PHP vienkārši nav iespējams panākt.

    Bet tagad jau visi kodē mākonī. Varbūt tas ir risinājums?

    Komentārs by Papuass — 2009-07-15 @ 23:32

    • Nevajag jau arī pārspīlēt ar mākoņiem🙂 Nav tie aprēķini tik traki, ka vajag serveru fermu.

      Komentārs by Sandis — 2009-07-20 @ 16:25

  14. Piekrītu idejai par optimizāciju + kešošana.

    Komentārs by marrtins — 2009-07-16 @ 0:17

  15. Hmm. Savulaik, strādājot VIDā, bija viena PHP rakstīta sistēma, kurai arī strestestu laikā tika konstatētas veiktspējas problēmas. Problēma bija stringu specifiskā parsēšanā un apstrādē.
    Lai novērstu problēmu, necentos visu biznesa loģiku pārrakstīt uz C, bet gan uzrakstīju konkrēto parseri kā PHP moduli iekš C. Rezultātā veiktspēja desmitkāršojās.

    P.S. Tā kā PHP nav “just-in-time” kompilators, tad nevajag tikai, ka C pret PHP kodu nebūs atšķirības. Atšķirība būs – īpaši intensīvā skaitļošanā. Pie kam milzīga (10-20 reizes). Pats esmu pārliecinājies. Cita lieta, ka, ja nenotiek intensīva skaitļošana vai arī tā notiek ar PHP iebūvētajām funkcijām (kuras pašas rakstītas C), tad šāda “optimizācija” gan neko daudz nedos. Pirmkārt, protams, jācenšas optimizēt pašu PHP kodu, tad (ja nepalīdz) jāatrod “smago” koda daļu, to “jāiznes” atsevišķā funkcijā un tad jau to var realizēt iekš C kā PHP moduli. Domāju, ka tas ir labākais, ja PHP ir tava “primārā” valoda. Man, personīgi, nav arī iebildumu pret “tīru” C.

    Komentārs by nazis — 2009-08-5 @ 12:06

    • Izmēģināju XDebug – apache-php kļuva nestabils, tāpēc atteicos. hz, negribējās iedziļināties.

      Palaižot failu izpildīties no komandrindas caur php procesoru, rēgojās vairākas kļūdas. Lēnām apkarojot atradu visādus agrāk nepamanītus gļukus un paātrināju izpildes laikus. Laikam kļūdu konstatēšana/ķeršana php izpildē sagādā bremzēšanu.

      Manā gadījumā tieši notiek intensīva skaitļošana ar vērtībām datu masīvā. Pārtaisīt pašas rēķināšanas funkcijas C varētu būt risinājums.

      Komentārs by Sandis — 2009-08-5 @ 14:57


RSS feed for comments on this post. TrackBack URI

Komentēt

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Mainīt )

Twitter picture

You are commenting using your Twitter account. Log Out / Mainīt )

Facebook photo

You are commenting using your Facebook account. Log Out / Mainīt )

Google+ photo

You are commenting using your Google+ account. Log Out / Mainīt )

Connecting to %s

WordPress.com blogs.

%d bloggers like this: