Archive for the ‘Programmieren’ Category

Der LINQ Benchmark hat ein kleines Update erhalten.

Beim Benchmark 2 Run 2 fehlte die Zuweisung zum Objekt. Außerdem werden jetzt noch Zusatzinformationen ausgegeben um eine leichtere Zuordnung zum jeweiligen Abschnitt in der Dokumentation zu ermöglichen.

LINQ_Benchmark.zip (232 KB)

Die Werte haben sich nur geringfügig verändert, was wohl eher an der niedrigeren Grundlast auf der Testmaschine lag. Ansonsten ist die Verteilung gleich geblieben.

Jetzt wo .NET 3.5 mit LINQ raus ist, bin ich neugierig geworden ob LINQ mir Arbeit abnehmen kann.

Da ich z.B. beim Dynamic Data Cache keine Datenbank verwende und den Zugriff auf die gecachten Datenobjekte umständlich programmieren muß, baute ich mir ein Benchmarktool.

Das Tool selbst ist eigenständig zu sehen und war für mich ein Testballon zum Thema LINQ.

Wer mehr darüber lesen will, der kann sich unter dem folgenden Link die Dokumentation, Sourcen und benötigten Dateien herunter laden:

LINQ_Benchmark.zip (224 KB)

Und hier noch kurz das Ergebnis:

LINQ benchmark result

Danke übrigens nochmal an TheUndeadable, der mir mit Tips und Korrekturlesen geholfen hat!

Endlich nach langer Zeit ist es soweit!

Microsoft hat heute das VisualStudio 2008 rausgebracht.

Und natürlich waren sie auch gleich so nett die Express Edition zu releasen :)

Visual Studio 2008 Express Edition

Und wieder mehr zum erlernen… hach ja… aber es macht Spaß! :D

Es ist geschafft! Version 0.1 vom DynamicDataCache ist fertig!

Dynamic Data Cache v0.1

Aber was ist das? Der DynamicDataCache (kurz DDC) ist nichts anderes als ein Ersatz für eine Datenbank.

Man “wirft” ein Objekt rein und holt es später wieder raus. Zusätzlich gibt es einen GarbageCollector, welcher regelmässig oder auf Anforderung diesen Cache scannt und wenig genutzte Objekte rauswirft. Das hört sich einfacher an, als es ist. Dadurch das die Daten alle im Hauptspeicher liegen, kann man extrem schnell drauf zugreifen.

Das ganze Konstrukt wird in den nächsten Wochen noch gewaltig erweitert. Sobald es einen bestimmten Punkt erreicht hat, werde ich es freigeben. Als Lizenz schwebt mir die BSD Lizenz vor. Sie ist nicht ganz so virulent wie z.B. die GPL.

So viel heute, die Tage gibt es mehr ;)

Nach einigen Mühen konnte ich das Templatesystem endlich mit dem Webserver verbinden.

Das Ergebnis sieht zwar nach nicht viel aus, stellt aber einen wichtigen Meilenstein für mich dar.

KK Gameserver incl. Templatesystem

In den nächsten Tagen folgt dann die neue Cache-Engine für den Webserver/das Templatesystem und der eigene “Memory-Handler”.

Bevor man mich falsch versteht, nein ich schreibe keinen echten Memory-Handler.

Es geht hierbei viel mehr um einen recht komplexen Code, welcher die Haltezeit und den Nutzungsgrad von Datenobjekten später speichern soll. Anhand dieser Informationen wird dann entschieden, ob ein Datenobjekt im Speicher gehalten werden muß, oder ob man es rauswerfen kann.

Ich bin immer mehr angetan von .Net.

Nicht nur das die Jungs von Microsoft die Entwicklungsumgebung für Lau rausrücken, nicht nur das sie die Sourcen jetzt nach und nach offen legen, nein, dank dem Team hinter Mono funktioniert das Zeug auch unter Linux!

Der Webserver unter Linux (Gentoo)

Was waren nochmal die Vorteile von OpenSource unter Linux?

* Jeder kann den Source einsehen… Wird im Moment nach und nach erfüllt.
* Es ist kostenlos… Ist bereits erfüllt.
* Jeder darf es verwenden der sich an die Lizenz hält… Sogar übererfüllt. Keine Virulente GPL und Co. Lizenz.
* Es ist gut dokumentiert… Ich würde mal sagen, daß sich hier die OpenSourcler mal ein dickes Stück von abschneiden können.

Hei… ich bin begeistert. Und das, obwohl ich bei .Net anfangs sehr skeptisch war.

Btw.. Danke an TheUndeadable für seine Hilfreichen Ideen und Tips!

Heute habe ich einen Logcache eingebaut und einen simplen Cache der für statische Seiten da ist.

Das Ergebnis war spitze :D

Concurrency Level: 10
Time taken for tests: 0.844204 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 3370000 bytes
HTML transferred: 2310000 bytes
Requests per second: 11845.48 [#/sec] (mean)
Time per request: 0.844 [ms] (mean)
Time per request: 0.084 [ms] (mean, across all concurrent requests)
Transfer rate: 3898.35 [Kbytes/sec] received

Mir macht im Moment noch ein seltsames Verhalten vom HttpListener Sorgen. Nach genau 28232 Requests macht er für 30 Sekunden dicht. Scheinbar hat Microsoft hier einen Schutzmechanismus eingebaut. Es wird nur die “spamende” IP geblockt für diesen Zeitraum. Von daher grinse ich und genieße das mal als Feature :D

Hier mal ein paar Performancewerte vom eigenen Webserver:

dana ~ # ab -c 100 -n 10000 http://192.168.10.9/test/index.htm
This is ApacheBench, Version 2.0.40-dev < $Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.10.9 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Finished 10000 requests

Server Software: Microsoft-HTTPAPI/1.0
Server Hostname: 192.168.10.9
Server Port: 80

Document Path: /test/index.htm
Document Length: 231 bytes

Concurrency Level: 100
Time taken for tests: 7.453964 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 3370000 bytes
HTML transferred: 2310000 bytes
Requests per second: 1341.57 [#/sec] (mean)
Time per request: 74.540 [ms] (mean)
Time per request: 0.745 [ms] (mean, across all concurrent requests)
Transfer rate: 441.51 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.3 0 4
Processing: 9 73 7.8 73 90
Waiting: 7 73 7.8 73 90
Total: 13 73 7.7 73 90

Percentage of the requests served within a certain time (ms)
50% 73
66% 77
75% 80
80% 81
90% 83
95% 85
98% 86
99% 87
100% 90 (longest request)

Ich habe die Tabelle um den pro Kampfrunde erzeugten Schaden ergänzt.

Anmerkung:

Die Angreifende Einheit befindet sich auf der X-Achse (Spaltenköpfe), die Verteidigende Einheit auf der Y-Achse (Zeilenköpfe).

Einheiten wir die Armbrustschützen sind reine Fernkämpfer.

Kampfsystem erzeugter vs. eingesteckter Schaden

Ich habe mir mal die Mühe gemacht und eine Kreuzliste erstellt, in welcher man den erzeugten Schaden im Vergleich zum eingesteckten Schaden sehen kann.

Rot ist dabei für den erzeugten Schaden, schwarz für den eingesteckten Schaden.

Es kämpfen jeweils 100 gegen 100 Einheiten. Der Kampf wird bis zum Abbruch durch einen zu hohen Verteidigungsmalus aufgrund Ermüdung, oder dem Auslöschen der Gegnerischen Einheiten berechnet.

Kampfsystem erzeugter vs. eingesteckter Schaden