F
FredyH
Gast
Hallo,
Ich hab mir mal zum spaß ein Brute-Force Programm geschrieben, um zu testen wie lang meine passwörter standhalten. Dieses Programm habe ich in C#, Java und C++ geschrieben um die Performance der Sprachen zu vergleichen.
Bei C++ bekomme ich 10 Millionen versuche die Sekunde (in der Konsole)
Bei Java 1,5 Millionen(vorallem wegen GUI)
und in C# nichtmal 1000.
Ich weiß wirklich nicht woran das liegt, ich benutze die gleiche Logik für alle 3 Sprachen (je nach Sprache leicht abgeändert) und ich dachte eigentlich sogar, dass C# eine bessere Performace hat als Java.
Code in Java:
Code in C#:
Es ist unschön zu lesen und im prinzip nur von Java kopiert(deswegen die namen merkwürdig) aber im Prinzip sollte es keinen großen unterschied geben...
Beide Methoden laufen in einem Thread.
Nun meine Frage:
Woran liegt es, dass C# so langsam ist, und wie kann ich es verbessern, dass es zumindest genau so gut ist wie Java?
soul0ry
Ich hab mir mal zum spaß ein Brute-Force Programm geschrieben, um zu testen wie lang meine passwörter standhalten. Dieses Programm habe ich in C#, Java und C++ geschrieben um die Performance der Sprachen zu vergleichen.
Bei C++ bekomme ich 10 Millionen versuche die Sekunde (in der Konsole)
Bei Java 1,5 Millionen(vorallem wegen GUI)
und in C# nichtmal 1000.
Ich weiß wirklich nicht woran das liegt, ich benutze die gleiche Logik für alle 3 Sprachen (je nach Sprache leicht abgeändert) und ich dachte eigentlich sogar, dass C# eine bessere Performace hat als Java.
Code in Java:
Code:
static long last;
static JFrame f;
static JButton b;
static JTextField feld;
static JLabel l;
static JLabel iter;
static JLabel iterps;
static String inputstring = "";
static int curtime;
static String curstring = " ";
static char curchar;
static int charint = 0;
static int maxpos = 0;
static int count = 0;
static volatile RunThread t;
public void run()
{
last = System.nanoTime() / 1000000;
while (!curstring.equals(inputstring))
{
charint++;
count++;
curchar = (char) charint;
if (count % 1000 == 0)
{
iter.setText("Iterations:" + count);
iterps.setText("Iterations/s: "
+ ((float) count / ((float) curtime / 1000)));
l.setText("Time: " + ((float) curtime / 1000));
}
long newlast = System.nanoTime() / 1000000;
long dif = newlast - last;
curtime += dif;
last = newlast;
char[] chararray = curstring.toCharArray();
if (charint >= 255)
{
charint = 0;
int bufpos = 0;
while (bufpos < chararray.length)
{
for (int i = 0; i < bufpos; i++)
{
chararray[bufpos] = (char) 0;
}
if (bufpos == maxpos)
{
maxpos++;
char[] buffer = new char[chararray.length + 1];
for (int i = 0; i < buffer.length; i++)
{
buffer[i] = (char) 0;
}
chararray = buffer;
}
if (chararray.length > bufpos + 1)
{
int x = (int) chararray[bufpos + 1];
x++;
chararray[bufpos + 1] = (char) x;
if (!(x > 255))
break;
}
bufpos++;
}
}
chararray[0] = curchar;
curstring = String.valueOf(chararray);
feld.setText(curstring);
if (t == null)
break;
}
iter.setText("Iterations:" + count);
iterps.setText("Iterations/s: "
+ ((float) count / ((float) curtime / 1000)));
l.setText("Time: " + ((float) curtime / 1000));
feld.setText(curstring);
b.setText("Start");
feld.setFocusable(true);
t = null;
t2 = null;
}
Code in C#:
Code:
String inputstring = "";
long curtime;
String curstring = " ";
char curchar;
Thread t;
int charint = 0;
int maxpos = 0;
int count = 0;
static long last;
public void run()
{
last = Environment.TickCount / 1000;
while (!curstring.Equals(inputstring))
{
charint++;
count++;
curchar = (char)charint;
if (count % 10000 == 0)
{
SetText("Iterations:" + count, label2);
SetText("Iterations/s: " + ((float)count / ((float)curtime)), label3); ;
SetText("Time: " + ((float)curtime), label1);
}
long newlast = Environment.TickCount / 1000; ;
long dif = newlast - last;
curtime += dif;
last = newlast;
char[] chararray = curstring.ToCharArray();
if (charint >= 255)
{
charint = 0;
int bufpos = 0;
while (bufpos < chararray.Length)
{
for (int i = 0; i < bufpos; i++)
{
chararray[bufpos] = (char)0;
}
if (bufpos == maxpos)
{
maxpos++;
char[] buffer = new char[chararray.Length + 1];
for (int i = 0; i < buffer.Length; i++)
{
buffer[i] = (char)0;
}
chararray = buffer;
}
if (chararray.Length > bufpos + 1)
{
int x = (int)chararray[bufpos + 1];
x++;
chararray[bufpos + 1] = (char)x;
if (!(x > 255))
break;
}
bufpos++;
}
}
chararray[0] = curchar;
curstring = new string(chararray);
SetText(curstring, textBox1);
if (t == null)
break;
}
SetText("Start", button1);
t = null;
}
Es ist unschön zu lesen und im prinzip nur von Java kopiert(deswegen die namen merkwürdig) aber im Prinzip sollte es keinen großen unterschied geben...
Beide Methoden laufen in einem Thread.
Nun meine Frage:
Woran liegt es, dass C# so langsam ist, und wie kann ich es verbessern, dass es zumindest genau so gut ist wie Java?
soul0ry
Zuletzt bearbeitet von einem Moderator: