The Troll's factory

Geekeries & pensées
-->

Output Popen subprocess stdout (and stderr) in real-time in Python

So you’re writing a Python script and you are launching some other external command.

To achieve that, you are using the subprocess.Popen command, right.

But the subprocess is very slow, and it outputs data during it runtime, so you would like to output this data to the user as well, so that the user does not wait for the end of the subprocess before getting the information?

Example of a slow subprocess:

#!/bin/bash
for i in 1 2 3 4 5 6; do sleep 5 && echo "${i}th output" && echo "err output num ${i}" >&2; done

Well, that’s fairly easy, just redirect the subprocess’s stdout to your own stdout:

import sys
from subprocess import Popen
Popen("./slow_cmd_output.sh", stdout=sys.stdout, stderr=sys.stderr).communicate()

Although the catch here is the .communicate(). This will allow your program to wait for the end of the subprocess before executing the next line of code. So that your programm does not terminate execution before its subprocess, for instance.

Not that if you want to deamonize the script / zombify it, you can remove the .communicate() and the redirection of stdout and stderr will still work after your program’s termination.

Share and Enjoy:
  • Print
  • PDF
  • Twitter
  • Facebook
  • LinkedIn
  • RSS
  • Wikio FR
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Technorati
  • Sphinn
  • Mixx
  • Add to favorites
  • Live
  • Netvibes
  • Scoopeo
  • viadeo FR
  • Identi.ca
  • MySpace
  • StumbleUpon
  • Yahoo! Buzz
posté par Troll dans astuces,Python,Scripts, astuces, dév. web avec aucun commentaire

Increase the maximum zoom in Mapnik tiles server (Apache + mod_tile + renderd) to 19

This is assuming that you followed this tutorial at: http://switch2osm.org/serving-tiles/manually-building-a-tile-server-12-04/ in order to setup your tiles server

If you want to increase the default maximum zoom (18) to 19, for instance, do the following:

vi /usr/local/etc/renderd.conf

Then, under the section [default], add: MAXZOOM=19

Share and Enjoy:
  • Print
  • PDF
  • Twitter
  • Facebook
  • LinkedIn
  • RSS
  • Wikio FR
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Technorati
  • Sphinn
  • Mixx
  • Add to favorites
  • Live
  • Netvibes
  • Scoopeo
  • viadeo FR
  • Identi.ca
  • MySpace
  • StumbleUpon
  • Yahoo! Buzz
posté par Troll dans OSM avec aucun commentaire

Installer HubiC sur Fedora 19

Télécharger le .tar.gz ici : http://mir7.ovh.net/ovh-applications/hubic/hubiC-Linux/1.1.13/

L’extraire (tar zvxf). Aller dans le dossier en console et taper :

sudo make
(cela suppose que vous avez make installé…)

Installer mono, mono-data et mono-sqlite :

sudo yum install mono-core mono-data-sqlite mono-data

Exporter la variable de session DBUS comme indiqué sur leurs forums :


$ dbus-launch --sh-syntax
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-XXXX,guid=XXXXXXX
DBUS_SESSION_BUS_PID=1234
$ export DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-XXXX,guid=XXXXXXX

(les lignes précédées de « $ » sont les lignes que vous devez exécuter, en mode utilisateur (sans sudo), les lignes sans « $ » devant sont juste un exemple de retour/sortie de la commande exécutée)

Lancer le service d’abord :

/usr/local/lib/hubic/hubic-service

Et effectuer le login après :

hubic login [email protected] /dossier/de/synchro/hubic

Vous devriez voir, dans la console où vous avez lancé le service hubic, des lignes du genre :

[INFO | 1/2/2014 11:15:43 AM | Ovh.Hubic.Sync.Linux.CLI.Server.MainLoop] Application starts (Version: 1.1.13.22-64; Platform: Unix 3.12.5.200)
[ERROR | 1/2/2014 11:15:45 AM | Ovh.Hubic.Sync.Model.OnLogin] Can't connect: (Calling: https://ws.ovh.com/hubic/r5/rest.dispatcher/getHubics, Status: NOT_FOUND) Compte non trouvé
[WARN | 1/2/2014 11:16:15 AM | Ovh.Hubic.Sync.AI.Indexer.Index] Synchronization default has never been synced. Synchronize it from scratch.
[INFO | 1/2/2014 11:16:15 AM | Ovh.Hubic.Sync.AI.ChangeProcessor.DoLocalMkdir] Local mkdir: /home/vous/hubic/Videos (for {default}/Videos)
[INFO | 1/2/2014 11:16:15 AM | Ovh.Hubic.Sync.AI.ChangeProcessor.DoLocalMkdir] Local mkdir: /home/vous/hubic/Images (for {default}/Images)
[INFO | 1/2/2014 11:16:15 AM | Ovh.Hubic.Sync.AI.ChangeProcessor.DoLocalMkdir] Local mkdir: /home/vous/hubic/Documents (for {default}/Documents)
[INFO | 1/2/2014 11:16:15 AM | Ovh.Hubic.Sync.AI.ChangeProcessor.DoSetSyncTag] Set synchronization tag on default.

Pour la partie concernant DBus, il est possible que cela marche sans la faire, à vous de tester. Le plus important est de bien lancer d’abord le service et le login ensuite.

(note : Merci également à MLO où j’ai trouvé des infos : http://www.mageialinux-online.org/forum/topic-16704+synchronization-hubic.php )

Share and Enjoy:
  • Print
  • PDF
  • Twitter
  • Facebook
  • LinkedIn
  • RSS
  • Wikio FR
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Technorati
  • Sphinn
  • Mixx
  • Add to favorites
  • Live
  • Netvibes
  • Scoopeo
  • viadeo FR
  • Identi.ca
  • MySpace
  • StumbleUpon
  • Yahoo! Buzz
posté par Troll dans Astuces Linux,Linux avec aucun commentaire

« Press Control-D to continue » error message at Fedora Startup

Just a quick tip, it seems that in some cases, when Fedora startup scripts do not manage to do a fsck check on the root volume, they will not start X server and just display a message saying something went wrong and you cannot either type the root password and figure it out yourself or press Control-D to continue.

So, this might not be the right solution for you but check out whether you got something like that in your logs :


- Unit systemd-remount-fs.service has begun starting up.
Jan 01 15:06:08 fedora-user.localdomain systemd[1]: Unit systemd-fsck-root.service entered failed state.
Jan 01 15:06:08 fedora-user.localdomain systemd[1]: Failed to start File System Check on Root Device.

In order to check that, when you’re asked whether to type Ctrl-D or your root password, at startup, type the root password and press Enter.

Then, type « journcalctl -xb » and look at the red lines to see if you have something like that. Note that the newest lines will be at the bottom, so you might have to scroll quite a bit. Also note that you might have red lines that are not very important and not what you’re looking for, don’t stop at the first red lines.

If you do have some error messages like the ones I pasted above, the only way I found was to boot into a LiveUSB, access my LVM Group using this very useful how-to: http://stevedowe.me/2012/01/how-to-recover-that-encrypted-ext4-formatted-logical-volume-you-allowed-fedora-to-create.html
and run the fsck.ext4 check so that it corrects the partition corruptions / errors that were present.

I then rebooted… and everything went smooth !

Share and Enjoy:
  • Print
  • PDF
  • Twitter
  • Facebook
  • LinkedIn
  • RSS
  • Wikio FR
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Technorati
  • Sphinn
  • Mixx
  • Add to favorites
  • Live
  • Netvibes
  • Scoopeo
  • viadeo FR
  • Identi.ca
  • MySpace
  • StumbleUpon
  • Yahoo! Buzz
posté par Troll dans Astuces Linux,Linux avec aucun commentaire

MTP on Fedora Linux 19 // Le MTP sur Fedora Linux 19

Version en Français en bas de la version Anglaise…

In order to get MTP to work on Fedora 19 with Nautilus (sorry if you’re using another file browser, I did not test other ones (does not work with Thunar, that I normally use, I just switch to Nautilus for MTP and then back to Thunar…) run the following command :

sudo yum install -y gvfs-mtp

Maybe online forums will tell you « install gvfs » but in fact this is not enough! You have to install gvfs-mtp in order to get it to work.

Note that it works with MTP, not PTP, at least for me…

===============================================

Afin de faire marcher le MTP sur Fedora 19 avec Nautilus (désolé si vous utilisez un autre gestionnaire de fichier, je n’ai testé qu’avec Nautilus (je sais que ça ne fonctionne pas avec Thunar notamment, que j’utilise notamment… sauf pour le MTP, du coup)), lancez la commande suivante dans un terminal :
sudo yum install -y gvfs-mtp

Vous trouverez plein de forums en ligne qui vous diront « installe gvfs » mais ça ne suffit pas ! Il faut installer gvfs-mtp afin que ça fonctionne vraiment.

Remarque : Ça ne fonctionne qu’avec MTP, pas PTP… en tout cas pour moi…

Share and Enjoy:
  • Print
  • PDF
  • Twitter
  • Facebook
  • LinkedIn
  • RSS
  • Wikio FR
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Technorati
  • Sphinn
  • Mixx
  • Add to favorites
  • Live
  • Netvibes
  • Scoopeo
  • viadeo FR
  • Identi.ca
  • MySpace
  • StumbleUpon
  • Yahoo! Buzz
posté par Troll dans Astuces Linux,Linux avec aucun commentaire

Keyboard shortcuts are gone / not working after XFCE upgrade to 4.10 // Raccourcis claviers ne fonctionnent plus après mise à jour vers XFCE 4.10

(version Française en bas de la version Anglaise)

Keyboard shortcuts have been a thing that’s being broken at one upgrade over two on XFCE for a while, but there’s usually a way to find the workaround on the Internets.

Except… This time. (Murphy’s law). I have not had any chance finding the answer to this new broken keyboard shortcuts (ALT + F2, among others) after upgrading to XFCE 4.10 (on Fedora Linux 19 x64, but that might probably apply for other distros as well :D).

So, not sure if it’s going to work for you, but after trying one by one to remove files of my XFCE config folder, I found that this one is the faulty: ~/.config/xfce4/xfconf/xfce-perchannel-xml/displays.xml

Removing it (outside of a XFCE session, in TTY or using another Desktop Manager for instance) and restarting XFCE has solved the issue for me.

Just for reference, here’s the content of the file in my case : http://pastebin.com/y2Mdiwyt (in case someone is interested in debugging XFCE 4.10 :) ).

IF THIS DOES NOT WORK FOR YOU, here’s a tip: make a backup of your .config/xfce4 directory (cp ~/.config/xfce4 ~/.config/xfce4_bak -vR) and try to remove one by one files located in ~/.config/xfce4/xfconf/xfce-perchannel-xml/ and restart XFCE4 between each attempt, it will most likely come from one of them. Once you’ve found the faulty one, restore the rest of your backup and remove the one you’ve found is faulty. That’s what I did to figure out displays.xml was causing the bug.

During your tests, it’s also best to do a mv ~/.cache/sessions ~/.cache/sessions_bak in order not to interfere with your attemps, and restore it at the end.

——————————-

Et en bon vieux Français pour les Anglophobes (et les autres) :

Les raccourcis claviers ont toujours été une partie de XFCE4 qui est plus ou moins cassée à chaque mise à jour… Cependant, il y a généralement la solution quelque-part sur les Internetz…

Sauf… cette fois ! (Loi de Murphy). Ou alors je n’ai juste pas eu de chance en cherchant… Mais impossible de trouver de bidouille pour rectifier le souci cette fois-ci. :( Le souci ? Après mise à jour de XFCE vers la version 4.10 plus aucun raccourci clavier géré par XFCE ne fonctionne (ALT + F2 notamment).

Du coup, pas sûr que cela fonctionne pour vous, mais voici comment j’ai résolu le problème dans mon cas précis et après divers tentatives : supprimer le fichier ~/.config/xfce4/xfconf/xfce-perchannel-xml/displays.xml

La suppression de ce fichier (en dehors d’une session XFCE, en TTY ou depuis un autre gestionnaire de bureau (KDE, Gnome…)) et redémarrage de XFCE4 sont venus à bout de mon souci :)

Si ça en intéresse certains, voici ce que contenait mon fichier : http://pastebin.com/y2Mdiwyt (des fois que quelqu’un ait envie de débugger XFCE :))

SI CELA NE FONCTIONNE PAS POUR VOUS, je vous conseille : sauvegarde de votre dossier .config/xfce4 (cp ~/.config/xfce4 ~/.config/xfce4_bak -vR), puis tentez de supprimer un par un (en redémarrage XFCE4 entre chaque (juste réouvrir la session XFCE4)) les fichiers situés dans le dossier : ~/.config/xfce4/xfconf/xfce-perchannel-xml/

Cela viendra probablement d’un de ces fichiers :) Une fois que vous avez trouvé celui qui fait planter. Remettez votre dossier xfce4 original et supprimez ce fichier et cela devrait marcher :) C’est ce qui m’a permis de trouver le fichier, dans mon cas.

De plus, pendant que vous cherchez le fichier coupable, je vous conseille d’aussi virer temporairement le cache de session : mv ~/.cache/sessions ~/.cache/sessions_bak et le restaurer une fois le bug trouvé.

Share and Enjoy:
  • Print
  • PDF
  • Twitter
  • Facebook
  • LinkedIn
  • RSS
  • Wikio FR
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Technorati
  • Sphinn
  • Mixx
  • Add to favorites
  • Live
  • Netvibes
  • Scoopeo
  • viadeo FR
  • Identi.ca
  • MySpace
  • StumbleUpon
  • Yahoo! Buzz
posté par Troll dans Astuces Linux,Linux avec aucun commentaire

« No files found. » error during Cyanogen Installation on Galaxy S

Just a quick post to make the information widely available. I will see later if I can directly edit the CM wiki but for now:

If you are following the CyanogenMod Galaxy S Installation Guide, you might run into some issues.

Indeed, at the step where you have to do « Wipe data / Factory reset » and then « Install zip from SDCard » you will likely have an error message: « No files found. »

And, until recently, I thought I was simply skewed…

Guess what? Not exactly! For some reason, you have to select the « power off » option in the root menu of the Semaphore recovery. Then, re-power on the phone and go into recovery mode » (using the 3 buttons combo : Ctrl Up + Power + Home) and re-try… and it’ll certainly work then.

I don’t know why, don’t ask, it’s magic.

 

(actually, it could an issue with reloading the partition table, from the GNU/Linux knowledge I have :)  But I don’t know why it did not do that before recent versions of CM/Semaphore…)

Share and Enjoy:
  • Print
  • PDF
  • Twitter
  • Facebook
  • LinkedIn
  • RSS
  • Wikio FR
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Technorati
  • Sphinn
  • Mixx
  • Add to favorites
  • Live
  • Netvibes
  • Scoopeo
  • viadeo FR
  • Identi.ca
  • MySpace
  • StumbleUpon
  • Yahoo! Buzz
posté par Troll dans Android,astuces avec aucun commentaire

Google Docs : les alineas // paragraph first line indent

English readers: See English version at the bottom of the French one

 

 

Si vous cherchez sur Internet comment faire automatiquement des alineas dans Google Docs pour tous vos paragraphes, vous allez sûrement trouver plein de ressources qui vous disent d’aller éditer du CSS etc. … Non seulement la plupart des gens ne vont pas comprendre grand chose à ce qu’il sont en train de faire, mais en plus personnellement je n’ai jamais trouvé cette option !

Alors voici une vraie méthode qui marche et qui est simple :

Mettez le curseur sur un de vos paragraphe (le curseur d’écriture, pas juste votre pointeur)

Appliquer le style « Normal » à votre parapraphe en faisant : Format > Style de paragraphe > Normal > Appliquer le style

Ensuite, déplacez la petite barre bleu horizontale en haut de la règle vers la droite de la largeur de l’alinea que vous voulez (1cm par exemple):

Enfin, retournez dans les style de paragraphe mais cette fois choisissez « Mettre à jour », comme ceci : Format > Style de paragraphe > Normal > « Mettre à jour le texte Normal en fonction de »

Et hop ! Tous les paragraphes qui ont ce style auront dorénavant un alinea !

 

————————– English version ————————–

 

If you look on the Internet how to automatically have indentation on the first line of a paragraph in Google Docs, you will certainly find a lot of resources telling you to edit some CSS etc. … Not only most of the people will not understand what they are doing by doing that but I also never found this option, personally !

So here is a way to do it that works and is simple:

Place the cursor inside one of your parapraphs (the writing / keyboard cursor, not you mouse pointer!)

Apply the « Normal » paragraph style to your current paragraph by doing : Format > Paragraph styles > Normal > Apply

 

 

Them, move the small blue bar at the top of the rule to the right. Move it of how many cm you want for your indentation (1cm for instance):

Finally, go back in paragraph styles but this time choose the « Update to match » option: Format > Paragraph styles > Normal > Update Normal to match

And here you go! All your paragraph that have this style (which is the default one) will now be indented!

 

 

Share and Enjoy:
  • Print
  • PDF
  • Twitter
  • Facebook
  • LinkedIn
  • RSS
  • Wikio FR
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Technorati
  • Sphinn
  • Mixx
  • Add to favorites
  • Live
  • Netvibes
  • Scoopeo
  • viadeo FR
  • Identi.ca
  • MySpace
  • StumbleUpon
  • Yahoo! Buzz
posté par Troll dans astuces avec aucun commentaire

Humour à la Google (Suggest) – La compil’

Google Suggest est vraiment un outil génial pour se détendre le dimanche.

À vrai dire, c’est la seule chose pour laquelle il est utile à mon goût mais passons, voici de quoi vous faire sourire même s’il pleut des cordes en plein été chez vous :

 

Je vais dans un premier temps prendre des requêtes en français. Ce qui signifie qu’à part les autres pays francophones, a priori, elles ont quand même majoritairement été tapées par des français… Eh bien, regardez-donc :

 

Bon, on a une sacrée réputation. On déteste les anglais et on est pessimistes. Encore, ca passe. En effet certains pays n’ont pas autant de chance que nous, quelques exemples :
allemands

Les allemands ont effectivement tué des juifs mais bon… Alors comme ça, il ne sauraient pas flirter ? En tant que geek, je leur pardonne :)

Les indiens eux, sont moches, et ont visiblement un autre cliché très fort, ils regardent au loin !
indiens

Quant aux italiens, ces racistes… (humour, hein)

On remarquera le passage des J.O et du foot récemment qui a un peu biaisé les statistiques de Google Suggest. Vous le verrez également dans d’autres exemples un peu plus loins.
italiens

Côté stéréotypes, les portugais ne sont pas gâtés :
portugais

 

Bon, il est évident que les populations du monde ne sont pas égales devant les suggestions de Google Suggest.

Vous allez voir que si on met la requête au féminin, les écarts sont encore plus flagrants !

Si certains pays sont plutôt gâtés :

 

bresiliennes
italiennes
indiennes

 

D’autres le sont carrément moins :

anglaises
allemandes
portugaises

Tandis que d’autres intriguent par leurs qualités exceptionnelles :

les-francaises
Les Françaises de grossissent pas… j’en connais pas mal qui aimeraient bien que Google ait raison.

Les Françaises aiment les noirs ! Merde, suis fichu… Vais aller vivre au japon tiens, puisqu’elles vieillissent pas là-bas :

 

japonaises

Les Japonaises, elles, ont toutes les qualités, en plus de ne pas grossirent elles ne vieillissent pas ! Par contre, elles auraient hérité des cowboys, étrange tout ça…

 

Pour certains pays, on s’inquiètera (ou on se ravira) du fait que même les requêtes en anglais disent la même chose :
british-women

C’est définitifs, les Anglaises sont classées « moches ».

french-2

Et les Françaises définitivement « minces ».

spanish-women

 Les espagnoles, elles, qui n’avaient aucune suggestion en Français, sont plutôt appréciées par les anglophones.

Allez, maintenant, je vous offre un gros packer cadeau de stéréotypes en tout genre, certains prévus d’avance mais d’autres bien marrants car louffoques et inattendus :

amazoniens

Le peuples des « Amazoniens », vous connaissez, vous ?

australiens

Ben oui, c’est vrai ça, ils sont de l’autre côté de la Terre après tout…

brazilians

Bon, le jour où je travaille avec des Brésiliens je mets la réunion 30 minute plus tôt.

chinois

Mais c’est dégueuuuuu !

espagnols

Les espagnols se sont révoltés contre les Français ? What !?

french

Damn, c’est pas vrai !

hollandais

C’est vrai qu’ils sont pas petits …

australians

En raison du climat peut-etre ?

indians

Avis partagés pour nos amis asiatiques on dirait.

spanish

Damn, ils pas l’air appréciés nos amis Espagnols.

tunisiens

Tiens, peut-être parce-quelle sont rares, au Maghreb, non ?

Bon, mais ne désespérez par car en fait personne n’a de suggestion sympa sur Google Suggest, pas même Google lui-même :

pourquoi-google

Ni les concurrents d’ailleurs :

pourquoi-microsoft

Bon, en même temps Microsoft, ils l’ont un peu cherché hein…

 

Bon, maintenant qu’on a vexé tout le monde, on va passer sur des requêtes un peu plus « impersonnelles » pour oublier tout ça :
philosophie

Philosophie, quand tu nous tiens…

pourquoiil
pourquoiils
pourquoije
pourquoiles
pourquoinous
pourquoi-s
pourquoitu
pourquoi-u
pourquoivous
pourquoielle
Bon ça fait ressortir quelques complexes tout ça…

Et pour finir, toujours un grand plaisir, les relations humaines :

ma-copine
ma-femme

Je suis particulèrement fier de ma trouvaille pour celle-ci : « Ma femme s’appelle reviens ». Vraiment. Une pépite.

Pour, hey, on dirait pas que je suis pas équitable, voici les mêmes pour le genre opposé :

mon-copain
mon-mari

Ce qui est marrant ici, c’est que si on compare avec les suggestions en anglais on a une différence assez marquée. Les requêtes au féminin font majoritairement ressortir des noms de bouquins / films tandis que que celles au masculins sont plus proches des résultats francophones :
wife
girlfriend
husband
boyfriend

J’aime particulièrement cette dernière : « Mon copain a écrit un livre sur moi ». Allez, on finira sur cet instant poétique.
Si vous en avez de meilleurs, postez-les dans les commentaires et je les ajouterai ! Bon dimanche !

Share and Enjoy:
  • Print
  • PDF
  • Twitter
  • Facebook
  • LinkedIn
  • RSS
  • Wikio FR
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Technorati
  • Sphinn
  • Mixx
  • Add to favorites
  • Live
  • Netvibes
  • Scoopeo
  • viadeo FR
  • Identi.ca
  • MySpace
  • StumbleUpon
  • Yahoo! Buzz
posté par Troll dans Geekeries,humour avec aucun commentaire

PHP: USE concatenation NOT multiple echo / parameters

Print vs. Echo

I just went accross an interesting article about which of « print » or « echo » we should use in PHP.

The author has benchmarked the two solutions (though the data are certainly a bit old) shows that, although there is not much difference between the two, echo seems to be more efficient.

Great, I believe you.

Echo multiple statements / arguments vs. Concatenation

But at the end of the article, the author also suggest to use multiple parameters given to one echo statement instead of concatenation because concatenation is slow… bla bla…

As I have always been using concatenation (did not even know echo could take multiple arguments) and I never had any performance issue, I decided to check that and make a benchmark: echo 100,000 times two concatenated strings and do the same thing with two parameters and two echos statements…

The benchmark was clear: concatenation IS FASTER than the two other solutions.

String caching? Making a more relevant benchmark

As it appeared a bit weird to me, having been doing Java / C# mostly recently (with their slow concatenation that recreated a new object blabla), I thought « maybe the PHP VM is caching the result of the concatenated string, thus the benchmark is not relevant ».

OK, let’s check with a counter-possible-caching benchmark then:


$t0 = microtime(true);

define("MAX", 2000000);
File_put_ConTents("echobench._log", "");
function _log($str)
{
	File_put_ConTents("echobench._log", file_get_contents("echobench._log") . $str);
}

// Generating a bunch of string to concatenate to avoid PHP VM-caching
$strs = array();
for ($i=0; $i < MAX+1; $i++) { 
	$m = mt_rand(0, 200);
	$strs[$i] = '';
	for ($j=0; $j < $m; $j++) { 
		$strs[$i] .= chr(mt_rand(0, 255));
	}
}

// Loop where string concatenation caching is possible :
$t1 = microtime(true);
for ($i=0; $i < MAX; $i++) { 
	echo "Hello" . "World! 
"; } $t2 = microtime(true); _log("Concatenation, cached: " . ($t2-$t1) . "s\n"); // Loop where is is not : $t1 = microtime(true); for ($i=0; $i < MAX; $i++) { echo $strs[$i] . $strs[$i + 1]; } $t2 = microtime(true); _log("Concatenation, not cached: " . ($t2-$t1) . "s\n"); // Other ways to display stuff, with and without caching possible each time: $t1 = microtime(true); for ($i=0; $i < MAX; $i++) { echo $strs[$i]; echo $strs[$i + 1]; } $t2 = microtime(true); _log("Two echos, not cached: " . ($t2-$t1) . "s\n"); $t1 = microtime(true); for ($i=0; $i < MAX; $i++) { echo "Hello" , "
"; echo "World" , "
"; } $t2 = microtime(true); _log("Two echos, cached: " . ($t2-$t1) . "s\n"); $t1 = microtime(true); for ($i=0; $i < MAX; $i++) { echo $strs[$i], $strs[$i + 1];; } $t2 = microtime(true); _log("Two parameters, not cached: " . ($t2-$t1) . "s\n"); $t1 = microtime(true); for ($i=0; $i < MAX; $i++) { echo "Hello" , "World!" , "
"; } $t2 = microtime(true); _log("Two parameters, cached: " . ($t2-$t1) . "s\n"); $t3 = microtime(true); _log("Total benchmark time: " . ($t3-$t0)."\n");

I generated random strings at the beginning of the script. And I concatenate them after, in the loop. Thus, there is not even once the same concatenation happening, thus, no possible caching or whatever.

The benchmarked has been run on a 1.6GHz Atom processor, with the following command:

sudo nice -n -19 php -q echobanchmark.php > /dev/null

So the process was the most prioritized one on the OS and then there is no reason for any interference between the loops (moreover, the system was idle during the test (and there are 3 other virtual processors for doing whatever work the OS would need to do).

And do you know the result?

Here it goes:

Concatenation, cached: 7.4381861686707s
Concatenation, not cached: 9.9010219573975s
Two echos, not cached: 10.4353120327s
Two echos, cached: 14.883654117584s
Two parameters, not cached: 10.179102897644s
Two parameters, cached: 11.904446840286s
Total benchmark time: 928.97792601585

Conclusion: Concatenation is fast, very fast. It is rougly 30% faster than using the two parameters for echo (26.9268987% exactly) and roughly 30% faster than two echo statements as well (28.720999% exactly) and

The other conclusion here is that PHP does not seem to be caching strings very well. Both the two-parameters and two-statements echo loops are much slower when using a fresh new string and much faster when using something from the previously generated array. The difference between cached / non-cached loop for the concatenation loop is also not that impressive if we observe that my « not cached » loop is using strings of random length that can go until 200 chars whereas the « cached » one is a very short string (so the difference of 2 seconds is certainly also due to the difference in length of the strings).

If you have any suggestion to improve the benchmark, feel free to post a comment.

Share and Enjoy:
  • Print
  • PDF
  • Twitter
  • Facebook
  • LinkedIn
  • RSS
  • Wikio FR
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Technorati
  • Sphinn
  • Mixx
  • Add to favorites
  • Live
  • Netvibes
  • Scoopeo
  • viadeo FR
  • Identi.ca
  • MySpace
  • StumbleUpon
  • Yahoo! Buzz
posté par Troll dans PHP,Scripts, astuces, dév. web avec aucun commentaire