benchmark.py

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 3. Juni 2005, 13:48

Hab einen kleinen Benchmark zusammen getippert... Nix besonderes und nicht wirklich ein allumfassender Test ;)
Aber ich wollte mal die Preformance eines Webservers mit meinem Rechner vergleichen ;)

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: ISO-8859-1 -*-

"""
small system Benchmark by jensdiemer.de

used fak_test by Dookie alias Fritz Cizmarov
"""

__version__ = "0.0.1"

### History
# v0.0.1
#   - erste Version

import time
start_time = time.time()

import os, random, sys, operator


if sys.version_info[:2] < (2,2):
    raise SystemError("need at least Version 2.2 of Python")




rnd_mem_size    = 10000
rnd_mem_count   = 100

rnd_disk_size   = 1000
rnd_disk_count  = 1000

norm_disk_MBsize= 30
norm_disk_count = 1000

fak_num     = 100000





class benchmark:
    def __init__( self ):
        self.rnd_mem_test()

        self.rnd_disk_test()

        self.fak_test()

        print "="*80
        print "complete test duration:"
        print "%.2fsec" % (time.time() - start_time)
        print "="*80



    def print_process( self, i, total ):
        "allg. Fortschrittanzeige"
        i += 1
        tresh = total / 10
        if tresh == 0:
            tresh = 1
        if i % tresh == 0:
            duration = time.time() - start_time
            print "%3.i%% %4.i/%i  %.2fsec" % ( round(float(i)/total*100), i, total, duration)



    def rnd_mem_test( self ):
        print "Random-MEM Test"
        print "-"*80
        print "Creating %i random-Blocks with a Size of %iBytes" % ( rnd_mem_count, rnd_mem_size )

        for i in range( rnd_mem_count ):
            trash = [ chr( random.randint(0,255) ) for r in range(rnd_mem_size) ]
            self.print_process(i, rnd_mem_count)



    def rnd_disk_test( self ):
        print
        print "Random-DISK Test"

        try:
            testfile = file( "benchtest.tmp", "w" )
        except Exception, e:
            print "Can't create Testfile:",e
            sys.exit(1)

        print "-"*80
        KBsize = rnd_disk_count * rnd_disk_size / 1024
        print "Write %i random-Blocks à %iBytes (total %iKB)" % ( rnd_disk_count, rnd_disk_size, KBsize )

        for i in range( rnd_disk_count ):
            testfile.write(
                    "".join( [ chr( random.randint(0,255) ) for r in range(rnd_disk_size) ] )
                )
            self.print_process(i, rnd_disk_count)

        testfile.close()
        testfile = file( "benchtest.tmp", "w" )

        print "-"*80
        print "Test Disk writing speed"
        blockMBsize = norm_disk_MBsize * 1024
        MBytes = blockMBsize * norm_disk_count / 1024 / 1024
        print "Writes %iMBytes (NULL-Bytes)" % ( MBytes )
        NULLblock = " " * blockMBsize

        disk_start_time = time.time()
        for i in xrange( norm_disk_count ):
            testfile.write( NULLblock )
            self.print_process( i, norm_disk_count )
        disk_end_time = time.time()

        testfile.close()

        print "-"*80
        print "%iMB/sec" % ( MBytes / ( disk_end_time-disk_start_time ) )

        try:
            # lösche Inhalt des Tempfile
            testfile = file( "benchtest.tmp", "w" )
            testfile.close()
        except:
            pass

        try:
            # Lösche Datei selber
            os.remove( "benchtest.tmp" )
        except Exception, e:
            print "Can't delete Testfile:",e
            sys.exit(1)



    def fak_test( self ):
        print
        print "fak Test"
        print "-"*80

        def fak_recursive(n):
            if n > 2:
                return n * fak_recursive(n-1)
            else:
                return n

        def fak_iter_while(n):
            res = n
            while n > 2:
                n -= 1   # entspricht n = n - 1
                res *= n # ginge auch als res = res * n
            return res

        def fak_iter_for(n):
            res = n
            for n in xrange(2,n):
                res *= n
            return res

        fak_lambda = lambda n: reduce(operator.mul, xrange(2,n),n)

        def test(funktion_name, f):
            print "%16s: %d Berechnungen..." % (funktion_name, fak_num),
            values = range(1,101)*(fak_num/100)
            t_start = time.time()
            for val in values:
                tmp = f(val)
            print "%.2fsec" % (time.time() - start_time)


        test("fak_recursive", fak_recursive)

        test("fak_iter_while", fak_iter_while)

        test("fak_iter_for", fak_iter_for)

        test("fak_lambda", fak_lambda)


if __name__ == "__main__":
    benchmark()


CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Freitag 3. Juni 2005, 21:02

Bei benchmarks muss man immer ein bischen aufpassen, was man misst. Beim schreiben von Zufallsdaten misst Du nicht nur das schreiben, sondern auch das Erzeugen der Zufallsdaten. Ist das Absicht?
Zuletzt geändert von BlackJack am Freitag 3. Juni 2005, 21:09, insgesamt 1-mal geändert.
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 3. Juni 2005, 21:04

Eigentlich schon... Der nachfolgende Test spuckt hinterher einen "Messwert" in MB/Sec. aus. Dabei wird ein immer ein Block geschrieben, der vorher erzeugt wurde...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten