Hi,
ich habe den FAST Corner Detector [1] von C nach Java übersetzt. Dieser wurde zum Teil automatisch generiert (die detect-Methode enthält ca. 3000 Zeilen mit If-Statements), dafür ist er in der C Version sehr schnell (auf einem 2,6GHz Opteron 1,3ms für ein 768x288 Bild). Eine portierte unmanged C# Version ist fast vergleichbar schnell.
Für die Java-Version brauchte ich nur wenige Anpassungen zu machen, dennoch benötigt der Algorithmus unter Java auf einer vergleichbaren Maschine 123ms, wovon ca. 80 ms auf die 3000 Zeilen if-Statements entfallen: Damit ist Java 92mal langsamer als die native C-Variante! Diverse Spielereien mit VM-Optionen (GC-, JIT-, Heap-Einstellungen) brachten keine wesentlichen Verbesserungen.
Nun meine Frage: Ist dieser Geschwindigkeitsunterschied normal für Java oder ist dies ein Spezialfall, indem Java die If-Statements weniger gut optimieren kann als ein C Compiler (vgl. Ausschnitt [2])?
Viele Grüße
[1]
FAST Corner Detection -- Edward Rosten
[2]
ich habe den FAST Corner Detector [1] von C nach Java übersetzt. Dieser wurde zum Teil automatisch generiert (die detect-Methode enthält ca. 3000 Zeilen mit If-Statements), dafür ist er in der C Version sehr schnell (auf einem 2,6GHz Opteron 1,3ms für ein 768x288 Bild). Eine portierte unmanged C# Version ist fast vergleichbar schnell.
Für die Java-Version brauchte ich nur wenige Anpassungen zu machen, dennoch benötigt der Algorithmus unter Java auf einer vergleichbaren Maschine 123ms, wovon ca. 80 ms auf die 3000 Zeilen if-Statements entfallen: Damit ist Java 92mal langsamer als die native C-Variante! Diverse Spielereien mit VM-Optionen (GC-, JIT-, Heap-Einstellungen) brachten keine wesentlichen Verbesserungen.
Nun meine Frage: Ist dieser Geschwindigkeitsunterschied normal für Java oder ist dies ein Spezialfall, indem Java die If-Statements weniger gut optimieren kann als ein C Compiler (vgl. Ausschnitt [2])?
Viele Grüße
[1]
FAST Corner Detection -- Edward Rosten
[2]
Java:
for(y=3; y < ysize - 3; y++)
for(x=3; x < xsize - 3; x++)
{
//const byte* p = im + y*stride + x;
offset_pointer=y*stride+x;
//int cb = *p + b;
//int c_b= *p - b;
int cb=im[offset_pointer]+b;
int c_b=im[offset_pointer]-b;
if(p[offset_pointer+pixel[0]] > cb)
if(p[offset_pointer+pixel[1]] > cb)
if(p[offset_pointer+pixel[2]] > cb)
if(p[offset_pointer+pixel[3]] > cb)
if(p[offset_pointer+pixel[4]] > cb)
if(p[offset_pointer+pixel[5]] > cb)
if(p[offset_pointer+pixel[6]] > cb)
if(p[offset_pointer+pixel[7]] > cb)
if(p[offset_pointer+pixel[8]] > cb)
{}
else
if(p[offset_pointer+pixel[15]] > cb)
{}
else
continue;
....usw