2010-12-15 54 views
7

Jusqu'à présent, j'écrivais des programmes en Perl. J'ai décidé d'essayer Python et j'ai remarqué quelques différences. Alors que perl a ARGV, regex, etc, ils doivent être importés en python. Je pensais que cela donnerait un avantage de performance à python puisque vous ne chargez que ce dont vous avez réellement besoin. J'ai donc écrit un programme de démonstration dans chaque langue pour tester ses performances.Quel langage de script fonctionne mieux dans vs perl vs python vs ruby?

Perl

#!/usr/bin/perl 

exit(1) if $ARGV[-1] ne 'test'; 
print "Testing...\n"; 

my $a = 1.0; 
my $i; 

for (0 .. 500) { $a+=$a/100; } 

printf "Result: %.5f\n", $a; 

Python

#!/usr/bin/python 

from sys import argv 

if argv[-1] != 'test': 
    exit(1) 

print 'Testing...' 

a = 1.0 
for i in range(0, 501): 
    a+=a/100 

print 'Result: %.5f' %a 

Ruby

#!/usr/bin/ruby 

if ARGV[0] != "test" 
exit(1) 
end 

print "Testing...\n" 
a = 1.0 

(0..500).each do a+=a/100 end 

printf "Result: %.5f", a 

C

#include <stdio.h> 
#include <string.h> 

int main (int argc, char *argv[]) { 

if (strcmp(argv[1], "test") != 0) return(1); 

printf("Testing...\n"); 

double a = 1.0; 
int i; 

for (i=0; i <= 500; i++) 
    a+=a/100; 

printf("Result: %.5f\n",a); 
return 0; 
} 

Les résultats sont les suivants:

Perl

0m0.006s réel
utilisateur 0m0.002s
sys

Py thon

0m0.075s réel
utilisateur 0m0.061s
sys

Ruby

Les 0m0.017s réels
utilisateur de 0m0.008s
sys 0m0.008s

C

0m0.003s réel
utilisateur 0m0.001s
sys 0m0.002s

est mon test erroné d'une certaine façon?

J'ai lu que python est mieux adapté pour les grands programmes (See here). Est-ce que ça va surperformer Perl alors? Qu'en est-il de leur utilisation de la mémoire?Je suis en train d'écrire quelques grandes applications à exécuter en tant que démons sur mon VPS qui a une quantité limitée de RAM donc mon but réel est de minimiser l'utilisation de la mémoire.

+9

500 entiers est à peine suffisant pour l'analyse comparative et que vous exécutez juste cette fois. Et d'une manière ou d'une autre, est-ce que cela vous importe vraiment? – user225312

+0

Pourquoi les downvotes? – zoul

+0

Parce que vous posez la mauvaise question. –

Répondre

0

Non, c'est à peu près là où je m'attendrais à voir ces langues en termes de performance relative.

Plus complètement les langages OO comme Python et Ruby sont intrinsèquement plus lents, ces deux derniers en particulier parce qu'ils sont interprétés. (ok python peut être compilé, mais c'est toujours lent)

La raison pour laquelle python serait considéré comme meilleur pour les programmes plus volumineux est qu'il est plus facile à organiser en tant qu'échelles de complexité. Il faut beaucoup de rigueur pour gérer un grand nombre de scripts Perl interreliés. Surtout quand vous ne pouvez pas les lire deux semaines plus tard. = o)

Le temps du programmeur est aussi important que le temps du processeur dans la plupart des cas.

+0

Mon application actuelle est écrite en Perl qui utilise environ 100 Mo de RAM. Je me suis dit que si je pouvais abattre cela d'au moins 30 Mo dans une langue différente, ça valait le temps que je passe à l'écrire parce que sinon je finirais par devoir passer à un plan supérieur. – perlit

+4

@perlit: Perl écrit naïvement peut prendre beaucoup plus de mémoire que Perl écrit avec un faible usage de la mémoire comme objectif. Cela dit, 100 Mo de mémoire virtuelle ne veut pas dire 100 Mo de RAM ... – ysth

+0

perlit: Perl utilise souvent moins de mémoire que les autres langages dynamiques. Passez en revue votre code, vous pouvez obtenir des économies de mémoire. –

6

Il y a quelques problèmes ...

  1. Votre test n'accumule pas assez de temps d'exécution, vous testez probablement la plupart du temps les frais généraux de démarrage de l'interprète, et même pas de mesure qui très précisément. Peu importe si Perl ou Python sont 10 fois plus rapides que Ruby, je veux utiliser ce que je considère être la meilleure langue ... celle dans laquelle j'ai le plus de motivation pour écrire ... celle que je pense qu'il est possible d'écrire du beau code.

  2. L'article esr est assez ancien et n'inclut certainement pas Ruby.

+5

Bien sûr, il est très possible (et facile) d'écrire du "beau" code (même si cela n'a aucun sens) en Python et même en Perl. Un bon programmeur trouve toujours un moyen. –

+0

1. ah, donc si je dors() pendant quelques secondes, cela serait-il plus précis? 2. Ce n'est pas la vitesse qui m'inquiète * vraiment *, c'est l'utilisation de la mémoire. Personnellement, j'aime perl mais je pensais que si réécrire mon application en python réduisait mon utilisation de la mémoire. – perlit

+0

Rafe, bien sûr, je devrais probablement avoir juste dit "ma langue préférée" et l'ai laissé à cela. :-) – DigitalRoss

3

Il n'y a pas de réponse générale à votre question sur la performance et l'indice de référence ne prouve presque rien, la performance est question trop complexe pour être jugé par un seul test. Perl moderne vous offre autant d'outils de domptage de complexité que n'importe quel autre langage décent et convient parfaitement à l'écriture de grands programmes. En ce qui concerne l'efficacité de la mémoire, vous pouvez dire que cette implémentation du langage X est moins gourmande en mémoire que cette implémentation du langage Y. Mais en pratique je pense que vous obtiendriez une variantion beaucoup plus élevée basée sur la façon dont vous codez et design. Et si vous maîtrisez déjà une langue, vous feriez probablement mieux d'utiliser celle-ci et d'acheter de la mémoire supplémentaire pour l'argent que vous économisez en changeant de langue. YMMV.

Et après avoir lu les commentaires: Essayer de réduire l'utilisation de la mémoire en réécrivant dans une autre langue sans profiler d'abord est fou.

0

Quelques question que je peux penser à:

  • Vous exploitez le nombre à virgule flottante. Vous ne savez pas comment il est implémenté sur chaque langue (quelle précision? Float? Double?) Cela peut entraîner une différence de vitesse/résultat.

  • Le nombre de comptes étant trop petit, vous devez effectuer une boucle imbriquée pour que le programme s'exécute pendant plus de 10 secondes.

Par exemple:

for(0:10000) // change variable depending on what your machine 
    for(0:10000) 
    // your operation here