C: Warum nicht schneller?

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Adabi
Beiträge: 5
Registriert: Mi Dez 11, 2013 6:56 pm

C: Warum nicht schneller?

Beitrag von Adabi » So Dez 15, 2013 12:58 am

Hallo zusammen

Ich bin mir nicht sicher, wo ich das am besten posten soll. Wenn es falsch ist, sorry.
Vielleicht könnte mir jemand folgendes erklären:
Wenn ich mir die CPU-Last beim Durchlauf eines C-Programms ansehe, stelle ich fest das kein einziger Kern zu mehr als 10-20% ausgenutzt wird, dass Programm aber trotzdem zB. 15 Sekunden braucht bis es durchgelaufen ist. Ich benutzte Codeblocks und GCC zum Kompilieren. Auch das Setzen des Compiler Flags zur Geschwindigkeitsoptimierung macht keinen Unterschied.

1. Warum ist das so, dass meine CPU nicht voll ausgenutzt wird?

2. Viel wichtiger, wie kann ich das ändern?

Gruss
A.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: C: Warum nicht schneller?

Beitrag von cloidnerux » So Dez 15, 2013 4:03 am

1. Warum ist das so, dass meine CPU nicht voll ausgenutzt wird?
Weil dein Betriebssystem deine Prozessorlast verwaltet. Du erhälst eine gewisse CPU Zeit und das wars. Wenn du deine Priorität erhöhst, erhälst du mehr Prozessorzeit.
Redundanz macht wiederholen unnötig.
quod erat expectandum

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: C: Warum nicht schneller?

Beitrag von mfro » So Dez 15, 2013 7:48 am

Adabi hat geschrieben: 1. Warum ist das so, dass meine CPU nicht voll ausgenutzt wird?

2. Viel wichtiger, wie kann ich das ändern?
Mit der Prozeßpriorität hat das nichts zu tun.

Ein Single-Thread Programm erhält - unabhängig von seiner Prozeßpriorität - soviel Prozessorzeit (vorausgesetzt, es gibt noch welche zu verteilen), daß es einen Kern voll auslasten kann (mit einer "Pseudo-Endlosschleife" läßt sich das recht gut nachvollziehen):

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char *argv[])
{
    int seconds = atoi(argv[1]);
    time_t t = time(&t);
    time_t tt = t + seconds;

    printf("looping for %d seconds\n", seconds);

    do
    {
        int dummy = 0;
        
        dummy++;
    } while ((t = time(&t)) < tt);

    printf("finished\n");
}
Wenn ich das Progrämmchen bei mir laufen lasse, geht die Prozessorauslastung für einen Kern auf (fast) 100% (den Rest verbringt es mit dem Auslesen der Systemuhr in time(), das geht aber recht flott).

Das wäre auch kein besonders guter Scheduler, der CPU-Zeit unbenutzt ließe, obwohl es Prozesse gibt, die dringend welche bräuchten.

Wenn dein Programm (bei einer ansonsten unbelasteten Maschine) nicht mindestens einen Kern zu nahzu 100% ausnutzt, heißt das, daß es auf irgendetwas wartet. Das dürfte mit großer Wahrscheinlichkeit irgendein Gerätetreiber sein, von dem dein Programm einen Wert haben möchte, bevor es damit weiterrechnen (= deine CPU auslasten) kann. Genauer kann man das nur sagen, wenn man weiß, was es tut.

Der Scheduler schickt Prozesse schlafen, die auf ein Ergebnis eines Gerätetreibers warten und weckt sie wieder auf, sobald dieses Ergebnis geliefert ist. Während dieser Zeit verbrauchen sie (logischerweise) keine CPU-Zeit.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Antworten