[linux-l] Java Thread vs. c fork

tknop at giant.local tknop at giant.local
Mo Okt 20 01:16:44 CEST 2003


* Thomas Knop <tknop at maxrelax.de> [20.10.03 00:45]:
> Ergebnisse
Jetzt mit Vergleich

System: Athlon XP 2500+ Mobile, 512 MB RAM
uname -msr
Linux 2.4.22 i686

diff tfork.c tfork2.c
2c2,4
< #define N 1000
---
> #include <sys/time.h>
> #include <fmt.h>
> #define N 500
14c16,19
<   
---
>   struct timeval start, stop;
>   char run_s[FMT_LONG];
> 
>   gettimeofday(&start,(struct timezone *)0);
18c23
<       writeln(2, "cna't fork :-(");
---
>       writeln(2, "can't fork :-(");
28a34,48
>   gettimeofday(&stop,(struct timezone *)0);
>   stop.tv_sec -= start.tv_sec;
>   if (stop.tv_usec < start.tv_usec) {
>     stop.tv_usec += 1000000L - start.tv_usec;
>     stop.tv_sec--;
>   } else {
>     stop.tv_usec -= start.tv_usec;
>   }
>   write(1, "runtime ", 8);
>   run_s[fmt_long(run_s,stop.tv_sec)] = 0;
>   write(1, run_s, strlen(run_s));
>   write(1, ".", 1);
>   run_s[fmt_ulong0(run_s,(unsigned long)stop.tv_usec,6)] = 0;
>   write(1, run_s, strlen(run_s));
>   writeln(1, " sec.");

diet gcc -Os -o tfork tfork.c /opt/diet/lib/libowfat.a
./tfork
runtime 0.033989 sec.

diff MakeThreads.java  MakeThreads2.java
3c3
< public class MakeThreads extends Thread {
---
> public class MakeThreads2 extends Thread {
5c5
<     public static int maxThreads = 1000;
---
>     public static int maxThreads = 500;
20c20
<           new MakeThreads().start();
---
>           new MakeThreads2().start();

../j2sdk_nb/j2sdk1.4.2/bin/java MakeThreads      
Exception in thread "main" java.lang.OutOfMemoryError: unable to create
new native thread
        at java.lang.Thread.start(Native Method)
	        at MakeThreads.main(MakeThreads.java:20)

... deswegen die Änderungen von 1000 auf 500

../j2sdk_nb/j2sdk1.4.2/bin/java MakeThreads2

Test done in 94 ms

Ok, jetzt gebe ich mich geschlagen: Java ist nur ~3 mal so langsam wie c ;-)

Zum Ausgleich darf man halt nur "kleine" Programme schreiben, weil sonst
mit dem Speicher bald Probleme auftreten. Jetzt weiß ich endlich wofür
man 64bit Architekturen braucht ;-)

PS: Wir vergessan aber nicht, dass ein fork() vom Prinzip her wesentlich
aufwendiger ist als ein neuen Thread zu erzeugen.

Gruß Thomas Knop 



Mehr Informationen über die Mailingliste linux-l