2009-11-25
Vortrag: Was eine WAF (nicht) kann
Gestern habe ich auf dem OWASP-Stammtisch München einen Vortrag zum Thema Was eine WAF (nicht) kann gehalten. Es gab jede Menge Diskussionen und hat mal wieder richtig Spaß gemacht :-)
2009-11-18
Kurioses vom C Präprozessor
Schauen wir uns mal dieses File an:
#define CPP1(s) #s
#define CPP2(s) CPP1(s)
char *a = CPP1(HELLO);
char *b = CPP2(HELLO);
CPP1() benutzt #s, den Operator im C-Preprozessor, der einen Namen in einen String umwandelt.
Eigentlich sollte man ja erwarten, das CPP1 und CPP2 identisch sind. Auf der ersten Blick ist das auch so:
$ gcc -E t.c
#...
char *a = "HELLO";
char *b = "HELLO";
Aber wenn man HELLO als Symbol definiert, ändert sich das Bild:
$ gcc -D HELLO=WORLD -E t.c
# ...
char *a = "HELLO";
char *b = "WORLD";
Wieder mal was über den C-Preprozessor gelernt.
2009-10-29
Exceptions in Python sind langsamer als gedacht
Heute habe ich mal wieder ein Python Aha Erlebnis gehabt. Beim Optimieren einer Klasse habe ich ein paar Benchmarks zum Theme dict() Zugriff und Exception Handling durchgeführt.
Kurz gesagt, brauche ich eine Funktion, die ein Key in mehreren dicts sucht.
Klassisch in Python implementiert man das so:
Für den Fall, das der Key gleich im ersten dict gefunden wird, ist die erste Methode sogar leicht schneller. Falls aber das Exception Handling getirggert wird, wird es richtig langsam. Auf meinem Laptop liefert timeit einen Faktor von 10(!) zwischen den beiden Methoden, zugunsten der zweiten. Das Exception abfangen und ignorieren kostet auf meinem Laptop 4 Mikrosekunden
Kurz gesagt, brauche ich eine Funktion, die ein Key in mehreren dicts sucht.
Klassisch in Python implementiert man das so:
def get_from_dict_list(dict_list,k):Eine alternative Implementation is
for d in dict_list:
try:
return d[k]
except KeyError:
pass
return None
def get_from_dict_list(dict_list,k):Die erste Methode wird normalweise bevorzugt. Dies hat zwei Gründe: Zum einen gilt der Spruch: "it's easier to ask forgiveness than permission" und exception handling ist ein integraler Bestandteil der Sprache. Zum anderen hat die zweite Methode potentielle Race-Conditions und kann eine unerwartete Exception werfen wenn k aus d gelöscht wird, während die Methode abgearbeitet wird.
for d in dict_list:
if k in d:
return d[k]
return None
Für den Fall, das der Key gleich im ersten dict gefunden wird, ist die erste Methode sogar leicht schneller. Falls aber das Exception Handling getirggert wird, wird es richtig langsam. Auf meinem Laptop liefert timeit einen Faktor von 10(!) zwischen den beiden Methoden, zugunsten der zweiten. Das Exception abfangen und ignorieren kostet auf meinem Laptop 4 Mikrosekunden
Abonnieren
Posts (Atom)