Forum: PC-Programmierung Java: Anzahl logischer CPUs bestimmen


von Frage (Gast)


Lesenswert?

Windows kennt ja die Anzahl der logischen CPUs. Wird diese Information 
auch an Java übermittelt? Ich möchte je nach System die optimale Anzahl 
an Threads starten.

von Christian O. (easter)


Lesenswert?

int cpu = (int) (Runtime.getRuntime().availableProcessors());

von Peter (Gast)


Lesenswert?

> Ich möchte je nach System die optimale Anzahl
> an Threads starten.
Das kann man aber pauschal nicht sagen, das die Anzahl der Thread der 
anzahl der CPUs das optimum ergibt.

Beispiel 1: 4CPUs und jeder Thread soll eine Datei auf der Festplatte 
kopieren - bei 4Thread bist du am ende Langsamer als wenn du nur 1Thread 
nimmt. Die Festplatte arbeitet nicht opitmal wenn mehere gleichzeitige 
zugriffe laufen.
(normale Festplatte, kein Raid, keine SSHD, keine Ramdisk)

Beispiel 2: 1 CPU und 1Thread der Daten aus einer Datenbank abruft. Das 
system langweilt sich vermutlich weil die Datenbank inc. Netzwerk nicht 
hinterherkommt. Da muss man also mehr Thread starten.

von Frage (Gast)


Lesenswert?

Danke für euere  Antworten. Speziell in meinem Fall (Bilder berechnen) 
ist es das Optimum. ;)

von mr.chip (Gast)


Lesenswert?

Kann man denn davon ausgehen, dass Java die verschiedenen Threads auch 
tatsächlich auf verschiedene Prozessoren verteilt? Zumal Java-Threads ja 
keine echten Prozesse sind.

von Frage (Gast)


Lesenswert?

Ja, das klappt sehr gut.

von Frage (Gast)


Lesenswert?

Ein Prozess (z.B. Java VM) kann durchaus aus mehreren parallel laufenden 
Threads bestehen.

von Linus (Gast)


Lesenswert?

>> Zumal Java-Threads ja keine echten Prozesse sind.

Threads gehören zum Prozess. Andernfalls kann man ja selbst Einfluss 
nehmen. Die Lastverteilung funktioniert ganz gut, das haben sie 
einigermassen hingekriegt. Du kannst dir ja die Java Sources anschauen 
ggf. für deine Zwecke anpassen. Wenns perfekt werden soll...

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Frage schrieb:
> Danke für euere  Antworten. Speziell in meinem Fall (Bilder berechnen)
> ist es das Optimum. ;)
Also meiner Ansichtnach irrst du da.
Die VM KANN das auf zwei Prozessoren verteilen... muß es aber nicht 
vieleicht nuzt ein anderes Programm kontinuierlich die andere CPU.
Solche Optimierungen bringen nix, du solltest einfach soviele Threads 
starten wie du brauchst.
Wenn du Glück hast laufen sie parralel, wenn nicht muß die Arbeit 
trozdem getan werden dann bringt es auch nichts zu warten bis die erste 
Operation fertig ist (Ausnahme natürlich wie schon angeprochen I/O auf 
Geräte die keinen wahlfreien Zugriff erlauben oder dieser sehr 'teuer' 
ist)

von Peter (Gast)


Lesenswert?

@Läubi ..
dem kann ich nicht zustimmen.

Es macht überhaupt kein sinn wenn 100 Bilder zu verarbeiten sind, dann 
100Threads zu starten weil einfach dann nichts mehr auf dem System geht. 
Wenn aber 2CPUs vorhanden sind dann macht es schon Sinn 2Thread zu 
starten. Selbst wenn etwas anderes noch läuft ist es es guter 
Kompromiss.

Man könnte aber auch dem Nutzer die wahl nach der anzahl der Thread 
lassen aber als Default ist in diesem fall die anzahl der cpus schon ok

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

@Peter
Ja okay, das war etwas allgemein gesagt. Wollte nur sagen das nicht man 
sich nicht zuviel davon versprechen sollte. Man sollte natürlich immer 
wissen was man tut, wobei 100 Threads auch noch nicht so die große 
Herausforderung für die VM darstellt ;)

von Frage (Gast)


Lesenswert?

> Man könnte aber auch dem Nutzer die wahl nach der anzahl der Thread
> lassen aber als Default ist in diesem fall die anzahl der cpus schon ok

Jo, genau das hatte ich auch vor. :)

Jedenfalls rendert mein P4 Einkerner schneller, wenn ich zwei Threads 
starte, da das Hyperthreading der CPU dann ausgenutzt wird.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.