2010-12-15 14 views
7

Do tej pory pisałem programy w Perlu. Postanowiłem dać Pythonowi szansę i zauważyłem kilka różnic. Podczas gdy perl ma wbudowane ARGV, regex itp., Muszą one zostać zaimportowane w pythonie. Pomyślałem, że to daje Pythonowi przewagę wydajności, ponieważ ładujesz tylko to, czego naprawdę potrzebujesz.Który język skryptowy działa lepiej w porównaniu z vs perl vs python vs ruby?

Tak więc napisałem program demonstracyjny w każdym języku, aby przetestować jego działanie.

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; 

Pythona

#!/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; 
} 

Wyniki są następujące:

Perl

prawdziwe 0m0.006s
użytkownik 0m0.002s
SYS 0m0.004s

Py Thon

prawdziwe 0m0.075s
użytkownik 0m0.061s
SYS 0m0.013s

Ruby

prawdziwe 0m0.017s
0m0.008s użytkowników
sys 0m0.008s

C

prawdziwe 0m0.003s
użytkownik 0m0.001s
sys 0m0.002s

Czy moje testy wadliwy w jakiś sposób?

Przeczytałem, że python lepiej nadaje się do dużych programów (See here). Czy to będzie lepsze od Perla? A co z ich wykorzystaniem pamięci?

Piszę kilka dużych aplikacji do uruchomienia jako demony na moim VPS, który ma ograniczoną ilość pamięci RAM, więc moim prawdziwym celem jest zminimalizowanie zużycia pamięci.

+9

500 całkowitymi wystarczy ledwie benchmarkingu i po prostu uruchomić ten jeden raz. A tak czy inaczej, czy to naprawdę ma dla ciebie znaczenie? – user225312

+0

Dlaczego spadki? – zoul

+0

Ponieważ zadajesz niewłaściwe pytanie. –

Odpowiedz

0

Nie, chodzi o to, gdzie spodziewam się zobaczyć te języki pod względem względnej wydajności.

Bardziej szczegółowo języki OO, takie jak Python i Ruby, są z natury wolniejsze, w szczególności dlatego, że są interpretowane. (OK, python może być kompilowany, ale wciąż wolny).

Powodem, dla którego python byłby uważany za lepszy dla większych programów, jest to, że łatwiej jest organizować je jako skale złożoności. Dokładne zarządzanie dużą liczbą powiązanych ze sobą skryptów perl wymaga dużej staranności. Zwłaszcza gdy nie możesz ich przeczytać dwa tygodnie później. = o)

W większości przypadków czas programisty jest tak samo ważny jak czas procesora.

+0

Moja aktualna aplikacja jest napisana w perlu, który używa około 100 MB pamięci RAM. Pomyślałem, że jeśli uda mi się to zepsuć co najmniej 30MB w innym języku, to warto poświęcić na to czas, ponieważ w przeciwnym razie będę musiał przejść na wyższy plan. – perlit

+4

@perlit: naiwnie napisany perl może zająć o wiele więcej pamięci niż perl napisany z użyciem pamięci o niskiej wartości jako celu. Powiedział, że 100MB pamięci wirtualnej nie oznacza 100Mb RAM ... – ysth

+0

perlit: Często Perl wykorzystuje mniej pamięci niż inne języki dynamiczne. Przejrzyj swój kod, możesz uzyskać trochę oszczędności pamięci. –

6

Istnieje kilka problemów ...

  1. testu nie gromadzą tyle czasu pracy, prawdopodobnie testowania większości narzutu uruchamiania interpretera, a nawet nie mierząc, że bardzo dokładnie.

  2. Nie obchodzi mnie, czy Perl lub Python są 10 razy szybsze niż Ruby, chcę użyć tego, co uważam za najlepszy język ... tego, który mam najwięcej motywacji do napisania ... myślę, że można napisać piękny kod.

  3. Artykuł esr jest dość stary iz pewnością nie zawiera rubinu.

+5

Oczywiście jest bardzo możliwe (i łatwe) napisanie "pięknego" (pomimo tego, że bez znaczenia jest to) kodu w Pythonie, a nawet w Perlu. Dobry programista zawsze znajdzie sposób. –

+0

1. ah, więc jeśli śpię() przez kilka sekund, czy byłoby to bardziej dokładne? 2. To nie jest szybkość, na jaką się naprawdę martwię, to wykorzystanie pamięci. Osobiście lubię Perla, ale zastanawiałem się, czy przepisanie mojej aplikacji w Pythonie może zmniejszyć wykorzystanie pamięci. – perlit

+0

Rafe, na pewno, prawdopodobnie powinienem był powiedzieć "mój ulubiony język" i zostawiłem to. :-) – DigitalRoss

3

Nie ma ogólnej odpowiedzi na pytanie dotyczące wydajności, a test porównawczy nie udowadnia praktycznie niczego, wydajność jest zbyt złożona, aby można ją było ocenić za pomocą pojedynczego testu. Nowoczesny Perl daje ci tyle samo narzędzi oswajania, jak każdy inny przyzwoity język i dobrze nadaje się do pisania dużych programów.

Co do wydajności pamięci, można powiedzieć, że ta implementacja języka X jest mniej wymagająca pamięci niż ta implementacja języka Y. Ale w praktyce myślę, że dostaniesz znacznie wyższy wariant zależnie od sposobu, w jaki kodujesz i projekt. A jeśli już biegle posługujesz się jednym językiem, prawdopodobnie lepiej skorzystasz z tego i kupisz dodatkową pamięć za zaoszczędzone pieniądze, przechodząc na inny język. YMMV.

Po przeczytaniu komentarzy: Próba ograniczenia użycia pamięci przez przepisanie na inny język bez profilowania najpierw jest szalony.

0

Kilka problem mogę myśleć:

  • obsługiwać na pływających numer. Nie wiesz, w jaki sposób jest on implementowany w każdym języku (którego dokładność? Float? Double?) Może powodować różnicę między szybkością i wynikiem.

  • Liczba wartości jest zbyt mała, należy wykonać pętlę zagnieżdżoną, aby program działał dłużej niż 10 sekund.

Na przykład:

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