Benchmarks για κλήσεις σε c, python, perl, php και java

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Benchmarks για κλήσεις σε c, python, perl, php και java

Δημοσίευση από cpulse » 20 Σεπ 2008 20:35

Υπάρχουν φορές που χρειάζομαι υποστήριξη από εξωτερικά scripts για την λειτουργία ενός συστήματος. Πάντα αναρωτιόμουνα ποιες γλώσσες είναι πραγματικά γρήγορες. Σε κάθε συζήτηση που βρίσκει κανείς στα forums και τα blogs υπάρχει πάντα κι ένας πωρωμένος με μια συγκεκριμένη γλώσσα. Η αντικειμενικότητα στο internet δυστυχώς είναι ανέκδοτο. Έτσι λοιπόν αποφάσισα να κάνω μερικά tests για τον εαυτό μου. Τα αποτελέσματα νομίζω είναι εκπληκτικά και μπορεί να είναι χρήσιμα και για άλλους, γι αυτό και τα δίνω όλα εδω.

Η ερώτηση που είχα πάντα μέσα μου δεν ήταν τόσο πολύ ποια γλώσσα είναι η ποιο γρήγορη, αλλά πόσο χρόνο χρειάζεται η κάθε γλώσσα για να ξεκινήσει. Η εκκίνηση ενός εξωτερικού script έχει εν μέρη μια καθυστέρηση από την κλήση στο σύστημα και στην συνέχεια υπάρχει το λεγόμενο warm up period. Επίσης τα τελευταία χρόνια όλες οι scriptογλώσσες έχουν και garbage collectors, οι οποίοι επίσης συμβάλουν στην καθυστέρηση.

Έφτιαξα λοιπόν ένα test το οποίο απλά διαβάζει τα αρχεία μέσα σε ένα directory. Τα αποτελέσματα είναι εκπληκτικά. Στην αρχή δεν μου φαινόντουσαν και πολύ σωστά. Έτσι μετά έκανα κι ένα δεύτερο test με regular expressions, κάτι που στις μέρες μας είναι πολύ χρήσιμο. Το δεύτερο test περίπου επιβεβαίωσε το πρώτο, αλλά είχα και σε αυτό μερικές εκπλήξεις.

Η μέθοδος που χρησιμοποίησα για να μετρήσω την διάρκεια της εκκίνησης ήταν πολύ απλή. Σε κάθε γλώσσα έβαλα μια εσωτερική μέτρηση χρόνου και το script που καλεί την κάθε γλώσσα έχει κι αυτό μια εξωτερική μέτρηση χρόνου. Η εξωτερική μέτρηση μείων την εσωτερική είναι η διάρκεια της εκκίνησης. Μεταξύ όλων των γλωσσών η C είναι η μόνη που τρέχει απευθείας, άρα ουσιαστικά δεν έχει warm up period ούτε garbage collection.

Έγιναν συνολικά 50,000 μετρήσεις. 5,000 για κάθε test σε κάθε γλώσσα. Όλοι οι χρόνοι είναι σε milliseconds (msec). Για κάθε test υπάρχουν οι ελάχιστοι χρόνοι, μέγιστοι, μέσοι όροι και Hertz. Το Hertz είναι ένας τρόπος μέτρησης που μου αρέσει πολύ γιατί είναι πρακτικός. Μετράει κύκλους ανά δευτερόλεπτο το οποίο είναι λίγο ποιο κατανοητό απο τα msec. Για παράδειγμα 100Hz σημαίνει οτι μπορούν να γίνουν 100 εκτελέσεις σε ένα δευτερόλεπτο.

Οι μετρήσεις έγιναν σε ένα PC με Intel Core 2 στα 2.4GHz, και με λειτουργικό Ubuntu Hardy 8.04.1. Καθώς γινόταν το test ο υπολογιστής έκανε κι άλλες δουλειές γι αυτό υπάρχει μεγάλο εύρος στις μετρήσεις. Είναι κάτι που επιδίωξα γιατί έτσι είναι και οι πραγματικές συνθήκες ενός web server. Για τα προγράμματα σε C έγινε compilation με GCC 4.2.3, η έκδοση της Python ήταν v2.5.2, της Perl v5.8.8, της PHP v5.2.4, και για Java χρησιμοποιήθηκε το JRE 1.6.0_06 της Sun. Για το compilation της Java χρησιμοποιήθηκε το Netbeans 6.1.

Υπάρχουν δύο λίστες με νούμερα και δύο γραφήματα για κάθε test. Στο ένα είναι μόνο οι χρόνοι εκκίνησης και στο δεύτερο η διάρκεια που χρειάστηκε η κάθε γλώσσα για να τρέξει το test.

Για όσους δεν έχουν εμπειρία από τέτοιες μετρήσεις, πρέπει να ξέρουν οτι οι αριθμοί των αποτελεσμάτων δεν είναι σημαντικοί. Σε ένα ποιο γρήγορο μηχάνημα οι χρόνοι θα είναι καλύτεροι και σε ένα ποιο αργό χειρότεροι. Αυτό που είναι σημαντικό είναι οι ποσοστιαίες διαφορές, γιατί σε όλα τα μηχανήματα θα είναι περίπου οι ίδιοι.

Σας δίνω πρώτα τα αποτελέσματα γιατί σε αυτά είναι το ζουμί, και μετά τον κώδικα που χρησιμοποίησα σε κάθε γλώσσα. Επειδή δεν είμαι ειδικός σε όλες αυτές τις γλώσσες, αν κάποιος έχει να προτείνει βελτιώσεις ας τις πει..

--

Εικόνα
Φαίνεται ξεκάθαρα οτι από τις σκριπτογλώσσες για τις εκκινήσεις η Python είναι η νικήτρια. Η PHP δύο φορές ποιο αργή, παρόλα αυτά πάλι καλά.. Νόμιζα οτι θα ήταν πολύ ποιο αργή. Μου κάνει πολύ μεγάλη εντύπωση όμως πόσο αργή είναι η Java. Στην εκτέλεση των προγραμμάτων η Java φαίνεται οτι παραείναι αργή, αλλά μάλλον δεν είναι και πολύ σωστό αυτό γιατί στο συγκεκριμένο directory που έγινε το test υπάρχουν 1600+ αρχεία και η Java είναι η μόνη που αντί να εξετάζει ένα ένα τα αρχεία τα φορτώνει πρώτα όλα στην μνήμη και μετά τα δίνει στο πρόγραμμα σαν array. Όπως κι αν έχει πάντω η διαφορά των επιδόσεων είναι πολύ απογοητευτική για την Java.

--

Εικόνα
Οι διαφορές στις εκκινήσεις είναι και πάλι σχεδόν τα ίδια. Αυτό που μου κάνει πολύ εντύπωση είναι η ταχύτητα της Perl στην εκτέλεση για regular expressions. Η PHP είναι επίσης γρήγορη και μάλιστα γρηγορότερη και από την C. Αυτό έχει λογική γιατί στην PHP υπάρχουν δύο βιβλιοθήκες για regular expressions. Οι ereg_* εντολές (POSIX regular expressions) και οι preg_* (Perl regular expressions). Σε αυτό το test χρησιμοποίησα τις preg_* εντολές. Η C χρησιμοποιεί την βιβλιοθήκη για POSIX, γι αυτό είναι τόσο αργή. Προφανώς και η Python θα χρησιμοποιεί wrappers για τα POSIX regular expressions. Η Java όμως είναι τελικά αργή και εδώ. Είναι απογοητευτικό.

---

Ακολουθούν οι πηγές για τα προγράμματα για το directory listing:

C

Κώδικας: Επιλογή όλων

#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>

int main&#40;&#41;
&#123;
	struct timeval tv;
	gettimeofday&#40;&tv, NULL&#41;;
	double t1 = &#40;double&#41; tv.tv_sec + &#40;double&#41; tv.tv_usec / 1000000;

	DIR *dir;
	struct dirent *file;

	dir = opendir&#40;"/usr/lib"&#41;;
	int count = 0;
	while &#40;file = readdir&#40;dir&#41;&#41;
		if &#40;strcmp&#40;file->d_name, "."&#41; && strcmp&#40;file->d_name, ".."&#41;&#41;
			count++;

	closedir&#40;dir&#41;;

	gettimeofday&#40;&tv, NULL&#41;;
	double t2 = &#40;double&#41; tv.tv_sec + &#40;double&#41; tv.tv_usec / 1000000;
	printf&#40;"%f\n", &#40;t2 - t1&#41; * 1000&#41;;
&#125;
Python

Κώδικας: Επιλογή όλων

#!/usr/bin/python

import os
import time

t1 = time.time&#40;&#41;

files = os.listdir&#40;"/usr/lib"&#41;
count = 0
for file in files&#58;
	count += 1

print "%f" % &#40;&#40;time.time&#40;&#41; - t1&#41; * 1000&#41;
Perl

Κώδικας: Επιλογή όλων

#!/usr/bin/perl

use Time&#58;&#58;HiRes qw&#40; gettimeofday &#41;;

&#40;$sec, $msec&#41; = gettimeofday;
$t1 = $sec + $msec / 1000000;

opendir&#40;dir, "/usr/lib"&#41;;
$count = 0;
while &#40;$file = readdir&#40;dir&#41;&#41; &#123;
	if &#40;$file ne "." && $file ne ".."&#41; &#123;
		$count++;
	&#125;
&#125;
closedir&#40;dir&#41;;

&#40;$sec, $msec&#41; = gettimeofday;
$t2 = $sec + $msec / 1000000;

printf&#40;"%f\n", &#40;$t2 - $t1&#41; * 1000&#41;;
PHP

Κώδικας: Επιλογή όλων

#!/usr/bin/php
<?php

$t = microtime&#40;true&#41;;
$count = 0;
if &#40;$dp = opendir&#40;'/usr/lib'&#41;&#41; &#123;
	while &#40;false !== &#40;$file = readdir&#40;$dp&#41;&#41;&#41;
		if &#40;$file != '.' && $file != '..'&#41;
			$count++;

	closedir&#40;$dp&#41;;
&#125;

echo &#40;&#40;microtime&#40;true&#41; - $t&#41; * 1000&#41; . "\n";

?>
Java

Κώδικας: Επιλογή όλων

package readdir;

import java.io.File;
import java.util.Date;

public class Main &#123;

    public static void main&#40;String&#91;&#93; args&#41; &#123;
        Date t1 = new Date&#40;&#41;;
        
        File dp = new File&#40;"/usr/lib"&#41;;
        String&#91;&#93; files = dp.list&#40;&#41;;
        
        Date t2 = new Date&#40;&#41;;
        System.out.println&#40;t2.getTime&#40;&#41; - t1.getTime&#40;&#41;&#41;;
    &#125;

&#125;
---

Πηγές για τα προγράμματα για τα regular expressions:

C

Κώδικας: Επιλογή όλων

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

int main&#40;&#41;
&#123;
	struct timeval tv;
	gettimeofday&#40;&tv, NULL&#41;;
	double t1 = &#40;double&#41; tv.tv_sec + &#40;double&#41; tv.tv_usec / 1000000;


	char str&#91;100&#93;;
	char *str_p = str;

	FILE* fp;
	int size;
	if &#40;fp = fopen&#40;"/media/play/sites/test/benchmark_exec/input.txt", "r"&#41;&#41; &#123;
		fseek&#40;fp, 0, SEEK_END&#41;;
		size = ftell&#40;fp&#41;;
		rewind&#40;fp&#41;;

		fread&#40;str, size, 1, fp&#41;;
		str&#91;size&#93; = '\0';

		fclose&#40;fp&#41;;

		unsigned int MAX_MATCH = 2;
		regex_t re;
		char *pattern = "a&#40;bc?&#91;1-5&#93;+&#41;";
		regmatch_t pmatch&#91;MAX_MATCH&#93;;
		regcomp&#40;&re, pattern, REG_ICASE | REG_EXTENDED&#41;;

		while &#40;regexec&#40;&re, str_p, MAX_MATCH, pmatch, 0&#41; == 0&#41;
			str_p += pmatch&#91;1&#93;.rm_eo;

		regfree&#40;&re&#41;;
	&#125;

	gettimeofday&#40;&tv, NULL&#41;;
	double t2 = &#40;double&#41; tv.tv_sec + &#40;double&#41; tv.tv_usec / 1000000;
	printf&#40;"%f\n", &#40;t2 - t1&#41; * 1000&#41;;
&#125;
Python

Κώδικας: Επιλογή όλων

#!/usr/bin/python

import re
import time

t1 = time.time&#40;&#41;;

str = open&#40;'/media/play/sites/test/benchmark_exec/input.txt', 'r'&#41;.read&#40;&#41;;
p = re.compile&#40;'a&#40;bc?&#91;1-5&#93;+&#41;', re.IGNORECASE&#41;
m = p.findall&#40;str&#41;

print "%f" % &#40;&#40;time.time&#40;&#41; - t1&#41; * 1000&#41;
Perl

Κώδικας: Επιλογή όλων

#!/usr/bin/perl

use Time&#58;&#58;HiRes qw&#40; gettimeofday &#41;;

&#40;$sec, $msec&#41; = gettimeofday;
$t1 = $sec + $msec / 1000000;

local $/ = undef;
open FILE, "/media/play/sites/test/benchmark_exec/input.txt";
$str = <FILE>;
close FILE;

$count = 0;
while &#40;$str =~ m/a&#40;bc?&#91;1-5&#93;+&#41;/ig&#41; &#123;
	$count++;
&#125;

&#40;$sec, $msec&#41; = gettimeofday;
$t2 = $sec + $msec / 1000000;

printf&#40;"%f\n", &#40;$t2 - $t1&#41; * 1000&#41;;
PHP

Κώδικας: Επιλογή όλων

#!/usr/bin/php
<?php

$t = microtime&#40;true&#41;;
$str = file_get_contents&#40;'/media/play/sites/test/benchmark_exec/input.txt'&#41;;
preg_match_all&#40;'/a&#40;bc?&#91;1-5&#93;+&#41;/i', $str, $m&#41;;
echo &#40;&#40;microtime&#40;true&#41; - $t&#41; * 1000&#41; . "\n";

?>
Java

Κώδικας: Επιλογή όλων

package regexp;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main &#123;

    public static void main&#40;String&#91;&#93; args&#41; &#123;
        Date t1 = new Date&#40;&#41;;

        try &#123;
            BufferedInputStream stream = new BufferedInputStream&#40;new FileInputStream&#40;"/media/play/sites/test/benchmark_exec/input.txt"&#41;&#41;;
            byte&#91;&#93; buffer = new byte&#91;1024&#93;;
            StringBuffer str = new StringBuffer&#40;&#41;;
            int bytes_read;
            while &#40;&#40;bytes_read = stream.read&#40;buffer&#41;&#41; != -1&#41; &#123;
                str.append&#40;new String&#40;buffer, 0, bytes_read&#41;&#41;;
            &#125;

            Pattern p = Pattern.compile&#40;"a&#40;bc?&#91;1-5&#93;+&#41;", Pattern.CASE_INSENSITIVE&#41;;
            Matcher m;

            m = p.matcher&#40;str.toString&#40;&#41;&#41;;
            int count = 0;
            while &#40;m.find&#40;&#41;&#41;
                count++;
        &#125;
        catch &#40;IOException ex&#41; &#123;
        &#125;
        
        Date t2 = new Date&#40;&#41;;
        System.out.println&#40;t2.getTime&#40;&#41; - t1.getTime&#40;&#41;&#41;;
    &#125;

&#125;
Το input.txt που χρησιμοποιούν περιέχει τα ακόλουθα:

Κώδικας: Επιλογή όλων

abc34defab453abc56
B3422AbC3422569
---

Το πρόγραμμα που καλούσε όλα τα παραπάνω tests είναι το εξής

Κώδικας: Επιλογή όλων

function run&#40;$language, $test&#41;
&#123;
	if &#40;$language == 'java'&#41; &#123;
		chdir&#40;"/media/play/sites/test/benchmark_exec/java/$test/build/classes"&#41;;
		$call = "java $test.Main";
	&#125;
	else &#123;
		$call = "/media/play/sites/test/benchmark_exec/$language/$test";
	&#125;

	$s_t = microtime&#40;true&#41;;
	exec&#40;$call, $out&#41;;
	$int = &#40;float&#41; $out&#91;0&#93;;
	$s_diff = &#40;microtime&#40;true&#41; - $s_t&#41; * 1000;

	$db = new mysqli&#40;'localhost', 'xxx', 'xxx', 'xxx'&#41;;
	$db->query&#40;sprintf&#40;"INSERT INTO benchmark &#40;language, test, t_out, t_in&#41; VALUES &#40;'%s', '%s', %f, %f&#41;", $language, $test, $s_diff - $int, $int&#41;&#41; or die&#40;$db->error&#41;;
&#125;

$t = time&#40;&#41;;
$test = 'readdir';
for &#40;$i = 1; $i <= 5000; $i++&#41; &#123;
	echo ", $i";
	run&#40;'c', $test&#41;;
	sleep&#40;1&#41;;
	run&#40;'java', $test&#41;;
	sleep&#40;1&#41;;
	run&#40;'perl', $test&#41;;
	sleep&#40;1&#41;;
	run&#40;'php', $test&#41;;
	sleep&#40;1&#41;;
	run&#40;'python', $test&#41;;
	sleep&#40;1&#41;;
&#125;
echo "\n" . &#40;&#40;time&#40;&#41; - $t&#41; / 60&#41; . " min\n";

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Benchmarks για κλήσεις σε c, python, perl, php και java

Δημοσίευση από cherouvim » 20 Σεπ 2008 22:22

Μην τρέχεις μία φορά μόνο το code in test. Παράγεις εντελώς τυχαία αποτελέσματα και λάθος συμπεράσματα.

Αν θες να τεστάρεις regex μην μπλέκεις file io μέσα.

Επίσης τα tests καλό είναι να έχουν της ίδιας βαρύτητας constructs μέσα τους. Το Date στη Java δε χρειάζεται. Πάρε αυτό που θες με System.currentTimeMillis().

Τέλος το να συγκρίνεις το startup time μεταξύ VMed γλώσσας με άλλες που τρέχουν πάνω στο o/s είναι λάθος και παραπλανητικό.

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Benchmarks για κλήσεις σε c, python, perl, php και java

Δημοσίευση από cpulse » 20 Σεπ 2008 22:55

Αυτό με το System.currentTimeMillis() θα το αλλάξω και θα ξαναδοκιμάσω. Γι αυτό είπα και οτι δεν είμαι ειδικός και οτι καλοδεχούμενα είναι όλα τα σχόλια για βελτιώσεις.

Αλλά γιατί λες οτι είναι παραπλανητικό; Θα το δοκιμάσω και από bash.. αλλά η δοκιμή ήταν γιατί υπάρχουν περιπτώσεις που θέλω να τρέχω scripts μέσα από php. Και έτσι κι αλλιώς την ίδια ακριβώς κλήση έκανα και σε όλες τις άλλες περιπτώσεις και το μέγεθος διαφοράς είναι σταθερό. Άρα γιατί να είναι παραπλανητικό;

Επίσης.. υπάρχουν παράμετροι που μπορώ να βάλω στο command line που καλώ την java για να το κάνω ποιο γρήγορο;

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Benchmarks για κλήσεις σε c, python, perl, php και java

Δημοσίευση από cherouvim » 21 Σεπ 2008 13:20

Με java -server τρέχεις το server vm που αργεί περισσότερο να ξεκινήσει αλλά τρέχει πιο γρήγορα τα προγράμματα (νομίζω έχει καλύτερο threading κτλ).

Κώδικας: Επιλογή όλων

C&#58;\>java -version
java version "1.6.0_06"
Java&#40;TM&#41; SE Runtime Environment &#40;build 1.6.0_06-b02&#41;
Java HotSpot&#40;TM&#41; Client VM &#40;build 10.0-b22, mixed mode&#41;

C&#58;\>java -server -version
java version "1.6.0_06"
Java&#40;TM&#41; SE Runtime Environment &#40;build 1.6.0_06-b02&#41;
Java HotSpot&#40;TM&#41; Server VM &#40;build 10.0-b22, mixed mode&#41;
Το να συγκρίνεις το startup time μιας γλώσσας που τρέχει πάνω στο o/s και μίας που τρέχει σε virtual machine είναι σαν να συγκρίνεις το 0-100 σε αυτοκίνητο και φορτηγό. Δεν έχει νόημα σαν γενικό benchmark, αλλά μόνο για τη δουλειά σου (το να τρέξεις γρήγορα external script).

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

Benchmarks για κλήσεις σε c, python, perl, php και java

Δημοσίευση από soteres2002 » 22 Σεπ 2008 00:21

Cpulse, συγχαριτήρια για το BM, σίγουρα πολλά από τα συμπεράσματά σου δεν πέφτουν κατά πολύ έξω και απο τα πιο ακριβή (βέβαια το ότι έχεις και άλλα processes τα χαλάει γιατί υποτίθεται θες benchmarks για τις γλώσσες μόνο, και όχι γενικα στο σύστημα πως παίζουν (άσε που απόλυτα σωστό benchmark δεν βγάζεις έτσι (με monte carlo simulation και μόνο με πιθανοθεωρητικά συμπεράσματα ίσως το πίστευα 100% πλην τα σφάλματα του πειράματος :kaloe: ))). Μερικά επι πλεόν strength tests για τα οποία είμαι περίεργος να δω πως θα συναγωνίζονταν οι γλώσσες είναι: ταχύς μετασχηματισμός Fourier, Elliptic curve encryption, Eratosthenes Sieve, Huffman/LZ{1,2} compression. Μια ερώτηση: η Perl και η ΡΗΡ τι modules είχαν φορτωμένα κατά τις δοκιμές που πραγματοποίησες; Αν μπορείς πες μας τι είδους setup είχες στις δοκιμές. Σίγουρα διαφορετικά compilations (πχ static/shared) πχ της ΡΗΡ, Perl ή Python θα έδιναν τελείως διαφορετικούς χρόνους ακόμα και για τα ίδια τεστ. Επίσης, υπάρχουν και διαφορές στο χρόνο φόρτωσης και εκτέλεσης, πολύ χρήσιμο για ειδικές εφαρμογές. Επίσης, το ίδιο και με τα shared modules της ΡΗΡ. Μου έχει τύχει να φορτώνω module για milter στην ΡΗΡ και να έχει τρελή καθυστέρηση εξ' αιτίας αυτού. Επίσης, με την ΡΗΡ έχω σπαταλήσει πολλές ώρες για να κάνω ένα καλό setup με την μέγιστη δυνατή βελτιστοποίηση όσον αφορά των συναρτήσεων που φαίνονται σε userspace (ειδικά για αυτούς που τρέχουν σέρβερς με πολύ λίγη μνήμη είναι πρόβλημα). Πάντως, παρατήρησα πως για την ΡΗΡ συγκεκριμένα μετά από πολύ ψάξιμο μπορείς να βγάλεις παααρα πολύ καλούς χρόνους με κατάλληλο compilation, πράγμα που φαίνεται τρέχοντας μερικά ζόρικα samples και επιλέγοντας κατάλληλο compiler (πχ intel compiler με optimization βγάζει φοβερά αποτελέσματα, το έχω δοκιμάσει, εν αντιθέσει με gcc), και πως το να κάνεις δοκιμές με πολλά άχρηστα για τη δοκιμή modules αλλοιώνουν το αποτέλεσμα. Γνώμη επομένως είναι οι δοκιμές να γίνονται σε stripped interpreters χωρίς περιττές λειτουργίες που ΣΙΓΟΥΡΑ παραπλανούν τα αποτελέσματα (θέλει όμως πολύ χρόνο για το τπτ στην τελική).

Όσον για τα τέστ με τις κανονικές εκφράσεις για την Perl μου φαίνονται απολύτως φυσιολογικά ασχετως άν το τέστ δεν πραγματοποιήθηκε με τον βέλτιστο δυνατό τρόπο. Η Perl έτσι κι αλλιώς φτιάχτηκε για αυτό το σκοπό (pattern matching) και σίγουρα έχει μεγάλη διαφορά στο χρόνο του compilation/matching of regexps γιατί δεν ακολουθεί το ίδιο path για την κλήση ρουτινών regexp εν αντιθεσει με PHP και Python (και όχι μόνο) όπου η δυνατότητα για pattern matching δεν είναι embedded μέσα στον interpreter (άρα έχει σημαντικές καθυστερήσεις για προφανείς λόγους αρχιτεκτονικής του interpreter).

Θα ήταν πολύ χρήσιμο να δούμε από το συνολικό χρόνο compilation μέχρι τέλος εκτέλεσης σε ποιες λειτουργίες καταμερίζεται αυτός ο χρόνος (loading execution). Αυτός είναι ένας παράγοντας που αδικεί την Java αν κρίνουμε ΜΟΝΟ από το συνολικό χρόνο εκτέλεσης, αλλά είναι απολύτως φυσιολογικό άν σκεφτεί κανείς τι διαδικασία που γίνεται από τη στιγμή της φόρτωσης μέχρι την εκτέλεση. Για scripting είναι πάνω κάτω τα ίδια, no surprise.

Eπίσης, στο http://shootout.alioth.debian.org/ υπάρχουν πολλά benchmarks με στατιστικά και κώδικα για διάφορες γλώσσες (βασικά γίνονται benchmarks σε συγκεκριμένα προγράμματα το καθένα 1:1 γραμμένο σε κάθε γλώσσα). Πάντως, και με 1.000.000 δοκιμαστικούς κώδικες/αλγορίθμους δε μπορείς να συγκρίνεις γενικά 2 γλώσσες (πόσο μάλλον περισσότερες).

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Benchmarks για κλήσεις σε c, python, perl, php και java

Δημοσίευση από cherouvim » 22 Σεπ 2008 15:23

Ρίξε μία ματιά στο: Anatomy of a flawed microbenchmark

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Benchmarks για κλήσεις σε c, python, perl, php και java

Δημοσίευση από cpulse » 22 Σεπ 2008 17:35

Λοιπόν μερικές απαντήσεις..

Πρώτων και κύριων, μάλλον παρεξηγήσατε το σκοπό αυτής της μέτρησης. Τα benchmarks επικεντρώνονται στην ταχύτητα εκκίνησης μιας scriptoγλώσσας. Αν ήθελα να ρωτήσω ποια γλώσσα είναι γρηγορότερη τότε θα έπρεπε να φτιάξω μια τεράστια βιβλιοθήκη με tests. Με ενδιαφέρει φυσικά να δω και ποια γλώσσα είναι γρηγορότερη, αλλά δεν γίνεται να βγάλεις αντικειμενικό συμπέρασμα από ένα thread ενός forum.

Μερικά πολύ γενικά συμπεράσματα όμως φαίνονται ξεκάθαρα. Δηλαδή πάει στα σκουπίδια ο μύθος οτι η Python είναι τόσο υπερβολικά ποιο γρήγορη από την PHP. Η Java φαίνεται οτι ό,τι test κι αν κάνεις θα έρχεται τελευταία και καταϊδρωμένη. Και κάτι που με ικανοποίησε πολύ, οτι τελικά οι Python, Perl και PHP δεν είναι και τόσο μακριά από την C που είναι το απόλυτο. Τώρα αν μπορείς να κάνεις καλύτερα compilations και να αλλάξεις τα αποτελέσματα κατά 10, 20 ή 30% το δέχομαι.

Μια σημείωση για τον cherouvim.. Φίλε μου Γιάννη, μου δίνεις την εντύπωση οτι το πήρες κάπως προσωπικά το θέμα. Αν πέφτω έστω και λίγο μέσα.. γλώσσες προγραμματισμού είναι, δεν είναι κάτι που αξίζει να παθιάζεσαι. Είναι το ίδιο σαν να παθιάζεσαι με έναν ποδοσφαιριστή που παίρνει δισεκατομμύρια από σένα. Αν μια γλώσσα είναι αργή αντί να ταυτιζόμαστε με αυτή, καλύτερα ας βάλουμε τις φωνές στους devs της μήπως και την βελτιώσουν. Παρόλα αυτά θα τρέξω ξανά τα tests με βελτιώσεις στην Java για να δούμε τελικά πόσο καλύτερα μπορεί να τα καταφέρει.

Και τώρα πιο συγκεκριμένα..


@soteres2002:

Δεν υπάρχουν πουθενά τυχαίες τιμές.. γιατί τα λες αυτά για monte carlo simulation;

Νομίζω οτι μάλλον με shared modules είναι όλα σετταρισμένα. Στο ubuntu έτσι κάθονται με τους αυτόματους installers. Έψαξα για .a αρχεία αλλά δεν βρήκα τίποτα. Αντίθετα βρήκα πολλά .so .

Επειδή οι πηγές (αυτές που μου ζήτησες με pm) και τα modules είναι πάρα πολλά, ειδικά αυτά της perl δεν τα γράφω εδώ. Κατέβασε τα από εδώ: benchmark.sql.zip, perl_modules.txt, php_modules.txt.

Σχετικά με αυτά που λες για παραπλανητικά συμπεράσματα και super cool compilers, πάλι να ξαναπώ οτι η ερώτηση μου είναι πόσο καλά μπορεί να τα καταφέρει σε REAL WORLD συνθήκες. Δεν με ενδιαφέρει να βρώ τον πιο κορυφαίο compiler γιατί στους servers μου και στους servers που το 99% των αναγνωστών αυτής της συζήτησης μόνο τον GCC βρίσκεις. Όπως είπα και στα specs η CPU του υπολογιστή που έτρεξε τα tests είναι διπλοπύρηνος, αλλά και πάλι με ενδιαφέρει να δω πως συμπεριφέρεται όταν ο kernel scheduler έχει και άλλα threads στην λίστα του, ή αν πρέπει παράλληλα να δεσμεύει/απελευθερώνει μνήμη ή να γίνεται προσπέλαση στους σκληρούς δίσκους. Για να μην παρεξηγηθώ, δεν έκανα και τίποτα δραματικό καθώς τρέχαν τα test. Απλά άνοιγα αρχεία και έγραφα scripts όπως κάνω καθημερινά.


@cherouvim:

Αντιλαμβάνομαι την λογική που έχεις για το VM, αλλά δεν το δέχομαι και στο 100%. Γιατί στην τελική ένα virtual machine είναι ένα σύνολο από op-codes κι ένα περιβάλλον που συντονίζει καταστάσεις. Χωρίς να το ονομάζουν VM, περίπου το ίδιο έχει και η PHP και η Python και η Perl. Ειδικά στην PHP το ίδιο ακριβώς script μπορείς να το τρέξεις και σε Linux και σε Windows και σε Mac. Δεν βρίσκεις πουθενά τον όρο VM αλλά ουσιαστικά VM έχουν φτιάξει.

Σχετικά με την παράμετρο -server αν θες μπορείς να με βοηθήσεις λίγο; Δηλαδή αν βάλω το -server ανοίγω daemon; Και μετά πως τρέχει ένα script πάνω στον daemon;

Για το Anatomy of a flawed microbenchmark, αν θες το συζητάμε μία προς μία παράγραφο. Αλλά νομίζω δεν έχει νόημα γιατί τα αποτελέσματα της Java είναι τόσο απογοητευτικά που δεν νομίζω οτι θα αλλάξουν και πολύ. Από όσα λέει σε αυτό το κείμενο πάω στο τελικό συμπέρασμα που λέει
So what do you do?

If you really want to know whether synchronization is faster than an alternate locking mechanism (or answer any similar micro-performance question), what do you do? One option (which won't sit well with most developers) is to "trust the experts."
Εσύ είσαι πολύ ποιο expert από μένα στην Java. Έχω κρατήσει την βελτίωση που πρότεινες για την μέτρηση του χρόνου. Έχω σκοπό επίσης να βάλω το περιεχόμενο του input.txt σε ένα απλό string και να τρέξω καμια 100αρα ή 1000άρα φορές το κομμάτι του regular expression για να δούμε καλύτερα πως θα πάει. Έχεις κάποια άλλη βελτίωση να προτείνεις;

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Benchmarks για κλήσεις σε c, python, perl, php και java

Δημοσίευση από cherouvim » 22 Σεπ 2008 18:39

Αλέξη δεν πήρα τίποτα προσωπικά.

Το benchmark σου έχει μετρήσει λάθος πράγμα οπότε τα αποτελέσματα είναι παραπλανητικά. Έχουν νόημα μόνο στο context που σε απασχολεί, δηλαδή την εκτέλεση εξωτερικού κώδικα. Με ένα (1) execution ενός τόσο μικρού κομματιού κώδικα μετράς πολλά διαφορετικά πράγματα εκτός από τη ταχύτητα του ίδιου του κώδικα. Φυσικά όπως είπες μόνο αυτό σε ενδιαφέρει, άρα καταϊδρωμένη δεν είναι η Java γενικά όπως λες αλλά το use case και ο τρόπος που μετράς.

Εννοείται οτι δε σου προτείνω να κάνεις αυτή τη δουλειά με Java.

Ρίξε και μία ματιά στα παρακάτω:
http://en.wikipedia.org/wiki/Java_perfo ... artup_time
http://en.wikipedia.org/wiki/Java_perfo ... gram_speed
http://en.wikipedia.org/wiki/Java_perfo ... _languages

φιλικά

υ.γ Έχω κάνει και εγώ πολλά simplistic benchmarks με σχεδόν στραβά αποτελέσματα και έκανα το λάθος να τα δημοσιεύσω αμέσως: http://blog.cherouvim.com/tomcat-vs-jboss-web/

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

Benchmarks για κλήσεις σε c, python, perl, php και java

Δημοσίευση από soteres2002 » 22 Σεπ 2008 22:12

Cpulse ευχαριστώ που διέθεσες τις μετρήσεις σου για public download, σίγουρα είναι πολύ χρήσιμες για όσους ενδιαφέρονται. Όσον αφορά το monte carlo simulation (γελάστε παρακαλώ), είναι ίσως ο μόνος γνωστός αξιόπιστος τρόπος για να παράγει κάποιος ένα αξιόπιστο τέστ σύγκρισης όταν έχεις να κάνεις με 1002 αστάθμητους παράγοντες (όπως πχ το πως διαχειρίζεται ο schduler τις διεργασίες ενώ κάνεις παράλληλα τα τέστ) ώστε να βγάλεις ένα γενικό μοντέλο συμπεριφοράς, άρα και στην τελική ένα αξιόπιστο σετ μετρήσεων. Δεν αφορά μόνο random processes και έχει πολλά variations, και μπορεί να εφαμοστεί και εδώ.

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες