Das Notes Forum

Lotus Notes / Domino Sonstiges => Java und .NET mit Notes/Domino => Thema gestartet von: flaite am 31.07.08 - 15:18:59

Titel: Zeitmessungen für Java
Beitrag von: flaite am 31.07.08 - 15:18:59
Java Agent,
- der durch eine View mit ca 100 Dokumenten iteriert
- ca. 40 Felder in 48 Dokumenten ausliest und in ein Bean schreibt
- mit diesen Daten eine 12 kb große cvs Datei erzeugt

Zeit: 0.175 Sekunden (gemessen als Differenz von System.currentTimeMillis() bei Start und beendigung des Agenten

Die Datenbank ist lokal und der Rechner hat 2 GB Arbeitsspeicher. 
Eingesetzt  wird Notes7.
Der Code ist nicht Performance-optimiert.

Ich bezweifele, dass das mit LotusScript schneller geht.

(Die hier geposteten Daten werden sich ändern, weil der Agent komplexer wird).
Titel: Re: Zeitmessungen für Java
Beitrag von: jBubbleBoy am 31.07.08 - 15:38:49
Warum?
Java und LS gehen doch über die gleiche API, schon mal mit LS versucht?
Titel: Re: Zeitmessungen für Java
Beitrag von: flaite am 31.07.08 - 15:44:54
So viel Zeit habe ich nicht, das extra in LotusScript umzuschreiben.
Das Erzeugen und Schreiben in die Datei geht nicht über die selbe API.
Aber du hast mich auf eine Idee gebracht. Die Messung für den Teil, in dem die 12 kb cvs Datei erzeugt wird (aus einer Collection aus 48 Beans) -> 16 Milisekunden.


Gruß Axel
Titel: Re: Zeitmessungen für Java
Beitrag von: flaite am 31.07.08 - 16:08:11
Man könnte eine Datei mit 1000 Zeilen aus 100 'a' erzeugen lassen und die Geschwindigkeit in verschiedenen Sprachen vergleichen.
Bedingung: Jede Zeile muß einzeln in die Datei geschrieben werden.
Ich übernehme Java und C#.
Titel: Re: Zeitmessungen für Java
Beitrag von: jBubbleBoy am 31.07.08 - 16:10:22
Ich kann das in LS und Java machen ;)
Titel: Re: Zeitmessungen für Java
Beitrag von: flaite am 31.07.08 - 16:11:32
ok. Muß jetzt noch arbeiten. Um ca. 21 Uhr kann ich mich damit beschäftigen.
Titel: Re: Zeitmessungen für Java
Beitrag von: jBubbleBoy am 31.07.08 - 16:27:05
für LotusScript

Code
Sub Initialize
	
	Dim filename$, filenum%
	Dim t1, t2, a%, s$, b%
	filename = "c:\temp\ls.txt"
	
	
	For a = 0 To 99
		s = s + "a"
	Next
	
	For b = 1 To 20 
		
		killFileName filename
		t1 = Timer
		
		filenum = Freefile()
		Open filename For Output As filenum
		For a = 0 To 999
			Print #filenum, s
		Next
		Close(filenum)
		
		t2 = Timer
		Print b & " --> " & (t2 - t1) * 1000
		
	Next
	
End Sub

Sub killFileName( FileName As String)
	On Error Goto ErrorZ
	Kill FileName	
	Goto EndeZ
ErrorZ:
	Resume EndeZ
EndeZ:
End Sub

Ergebnis in Millisekunden
Titel: Re: Zeitmessungen für Java
Beitrag von: koehlerbv am 31.07.08 - 17:03:41
Das ist schlechter Code:
Dim t1, t2, a%, s$, b%    -> t1 und t2 sind jetzt Variants. Kann in die Hose gehen
s = s + "a"   -> + ist kein String-Concatenator
Print b & " --> " & (t2 - t1) * 1000    -> Typwandlung wird LS überlassen

Das Ganze geht hier gut, kann aber in der Praxis zu Ergebnissen führen, die ganz anders aussehen, als man beim Schreiben erwartet hätte.  ;D

Bernhard

PS: Ich würde die Zeitmessung erst nach dem Anlegen des Files starten, sonst spielt hier die API des Systems mit herein und die Organisation der HDD.
Titel: Re: Zeitmessungen für Java
Beitrag von: flaite am 31.07.08 - 17:05:27
Hier sind die Ergebnisse für C#. Dennis will nach Hause. (Ergebnisse in Milisekunden).

1:49
2:91
3:7
4:7
5:7
6:31
7:7
8:30
9:7
10:7
11:7
12:7
13:7
14:23
15:44
16:36
17:21
18:7
19:7
20:7

Code
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Diagnostics;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            
            for (int j = 1; j <= 20; j++)
            {
                Stopwatch watch = new Stopwatch();
                watch.Start();

                StringBuilder sb = new StringBuilder(100);
                for (int i = 0; i < 100; i++)
                {
                    sb.Append("a");
                }
                StreamWriter sw = File.CreateText("C:\\temp\\myCShark.txt");
                for (int i = 0; i < 1000; i++)
                {
                    sw.WriteLine(sb.ToString());
                }

                sw.Close();
                watch.Stop();
                Console.WriteLine(j.ToString() + ":" + watch.ElapsedMilliseconds.ToString());


            }

            Console.ReadLine();

        }
    }
}
Der Code kann sicher noch bedeutend optimiert werden. Das gleiche gilt für den bald folgenden Java Code.
Titel: Re: Zeitmessungen für Java
Beitrag von: jBubbleBoy am 31.07.08 - 17:13:40
@bernhard
Wie sieht denn ein "String-Concatenator" aus?
Titel: Re: Zeitmessungen für Java
Beitrag von: koehlerbv am 31.07.08 - 17:15:27
&
Titel: Re: Zeitmessungen für Java
Beitrag von: jBubbleBoy am 31.07.08 - 17:19:07
Code
s = s & "a"
So ?
Titel: Re: Zeitmessungen für Java
Beitrag von: flaite am 31.07.08 - 17:19:36
Werte für Java:
1-->31ms
2-->31ms
3-->0ms
4-->16ms
5-->15ms
6-->16ms
7-->0ms
8-->16ms
9-->14ms
10-->15ms
11-->16ms
12-->16ms
13-->15ms
14-->16ms
15-->15ms
16-->16ms
17-->15ms
18-->16ms
19-->16ms
20-->16ms

Code
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;


public class IOTest {
	public static void main (String args[]) {
		for (int j= 1; j< 21;j++) {
			long timeStart = System.currentTimeMillis();
			File file = new File("C:/temp/javaNoEsLento.txt");
			BufferedWriter bw = null;
			try {
				bw = new BufferedWriter(new FileWriter(file));
				StringBuilder sb = new StringBuilder(); 
				for (int i=0; i<100;i++) {
					sb.append('a');
				}
				
				for (int i= 0;i<1000;i++) {
					bw.write(sb.toString() + "\n");
				}
				
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally {
				try {
					if (bw != null) bw.close();
				} catch (IOException ioe) {
				
				}
				System.out.println(j + "-->" + (System.currentTimeMillis() - timeStart) + "ms");
				
			}
			
		}
		
		
	}

}


Zugegeben weisen die 0ms auf gewisse Messungenauigkeiten hin.
Titel: Re: Zeitmessungen für Java
Beitrag von: koehlerbv am 31.07.08 - 17:23:00
Code
s = s & "a"
So ?

Ja.
Und hier
Print b & " --> " & (t2 - t1) * 1000
muss es heissen:
Print b & " --> " & Cstr ((t2 - t1) * 1000)

Sowie:
Dim t1 As Single

Das Thema wurde hier im Forum schon oft behandelt, auch Beispiele für die Nebeneffekte bei der "freizügigen" Typkonvertierung sind zu finden (u.a. von Axel Janssen).

Bernhard
Titel: Re: Zeitmessungen für Java
Beitrag von: koehlerbv am 31.07.08 - 17:26:15
@Axel: Und was ergibt jBlasenJungs Code auf Deiner Kiste? Derartige Vergleiche lohnen sich ja nur identischen Umgebungen.

Bernhard
Titel: Re: Zeitmessungen für Java
Beitrag von: jBubbleBoy am 31.07.08 - 17:26:34
Mein Java-Ergebnis, nach dem Code von Axel, musste nur StringBuilder mit StringBuffer austauschen.
Titel: Re: Zeitmessungen für Java
Beitrag von: jBubbleBoy am 31.07.08 - 17:29:13
@bernhard
deine Anmerkungen habe ich schon verstanden, nur sehe ich keinen Unterschied zwischen + und & beim Verbinden von Stringketten.
Titel: Re: Zeitmessungen für Java
Beitrag von: flaite am 31.07.08 - 17:37:38
Hier sind meine Daten für den LotusScript Agenten (lokal in Notes7 gestartet).
Titel: Re: Zeitmessungen für Java
Beitrag von: koehlerbv am 31.07.08 - 17:38:15
@bernhard
deine Anmerkungen habe ich schon verstanden, nur sehe ich keinen Unterschied zwischen + und & beim Verbinden von Stringketten.

Dann lies nach oder warte einfach, bist Du das erste Mal auf die Nase fällst. Für den Anfang kannst Du ja einfach mal
Messagebox 100 + "200"
ausprobieren, dann weisst Du, auf welch dünnem Eis Du da gehst.

Bernhard
Titel: Re: Zeitmessungen für Java
Beitrag von: flaite am 31.07.08 - 17:45:41
Mit Java1.4 wird der erste Durchlauf deutlich langsamer (0.125 Milisekunden).
Die anderen sind aber genau wie bei Java6 (Test vorher).
StringBuilder gibts erst seit Java5. Ist ein bischen schneller. Man sieht aber, dass diese Performance-Optimierung in unserem Test im Milisekunden-Bereich keine Auswirkungen zeigt.
Titel: Re: Zeitmessungen für Java
Beitrag von: flaite am 31.07.08 - 17:51:38
C# ist am schnellsten, gefolgt von Java und LotusScript, wobei man den Java-Code mit den nio Bibliotheken vermutlich noch deutlich performance-optimieren könnte.
Titel: Re: Zeitmessungen für Java
Beitrag von: koehlerbv am 31.07.08 - 18:02:49
Woran niemand gezweifelt hat, Axel.
Beim LS kann man sicher noch optimieren, aber da zieht dann die Java-/C-Seite auch nach: Unterm Strich bleibt das Verhältnis so.

Wie es dann im "real life" aussieht, ist eine andere Story:
- Was soll gemacht werden
- Wie entscheidend ist hier die Performance vs. Ladezeit des Moduls
- Wie geschickt stellt sich dann der ausführende Programmierer wirklich an?
etc. pp.

Bernhard
Titel: Re: Zeitmessungen für Java
Beitrag von: flaite am 31.07.08 - 18:47:11
Ladezeit von "Modulen" ist nicht so der Punkt.  Zusatz-Jars werden rasend schnell geladen. Es passieren auch nicht Situationen, dass Bibliotheken mehrfach geladen werden wie ich es etwa schon bei Skript-Bibliotheken beobachtet habe, wenn 2 sich gegenseitig im import hatten. Die JVM merkt sowas immer.
Ein Punkt ist, dass beim Starten der Anwendung immer eine VM geladen werden muß. Das spielt sich aber im Sekundenbereich ab und betrifft nur das Starten der Anwendung. Notes8 Classic muss allerdings auch erstmal geladen werden. Eine JVM als solche fällt bei den 30 Sekunden kaum ins Gewicht. 
Es ist nur höchst irreführend vom Startverhalten von Notes8  Standard auf Java zu schliessen:
- Eclipse war nie als GUI-Plattform gedacht sondern explizit als IDE Plattform. Das mit dem GUI war ein durch Kundenwünsche induzierter nachgeordneter Gedanke (afterthought).
- Die Implementierung von Eclipse als Notes GUI ist auch ein nachgeordneter Gedanke. Nicht alles wurde durch Java ersetzt. Im Grunde läuft das alte Notes in Eclipse. Das bringt ganz eigene Komplexitäten mit sich mit entsprechenden Auswirkungen auf die Performance.
- Notes8 Standard enthält eine Menge neuer Möglichkeiten v.a. auch zur Integration mit anderen Systemen. Auch das sind natürlich erstmal Kosten.
 
Titel: Re: Zeitmessungen für Java
Beitrag von: jBubbleBoy am 31.07.08 - 19:48:51
@bernhard
Das 100 + "200" nicht geht weiss ich schon seitdem ich notes programmiere (oder meine 1. LS Schulung halten durfte) und das mach ich jetzt schon 10 Jahre ;) Wenn man mit Strings arbeitet ist das problemlos anwendbar.
Bei der Typendeklaration gebe ich Dir allerdings Recht, hier versuche ich auch immer mit "Option explicit" zu arbeiten und alles korrekt zu deklarieren.

Also für mich hat sich in der Benutzung der Sprache nichts geändert, den hier geht es um Millesekunden. C# kann ich nicht, Java in Notes ist  nur für spezielle Einsätze zu gebrauchen. LS & Formelsprache bleibt zu 98% die Wahl der Qual in der Notesprogrammierung.
Titel: Re: Zeitmessungen für Java
Beitrag von: flaite am 08.08.08 - 17:48:36
Java in Notes ist  nur für spezielle Einsätze zu gebrauchen
Würd ich so noch nicht mal sagen. Neuen Code schreib ich gern in Java (so man mich läßt). Bin damit auch schneller. Man kann z.B. Agenten problemlos in Eclipse schreiben und von Notes importieren.
Oder ich mach die gesamte csv Zerlegung von Gedys Sales in Java und das ist viel Java Notes API.

Der Punkt ist nur, dass viel vorhandener Code eben in LotusScript geschrieben ist.
Und es fehlen halt die Frontend Klassen.
Gerüchteweise hört man: auch das nicht mehr lange.