2010-09-07 4 views
0

My previous questionDelphi 2010: Pas de fil vs fils - TSQLConnection et TSQLDataSet

De la réponse ci-dessus, signifie que si dans mes fils a créer des objets, je vais faire face au goulot d'étranglement des allocations de mémoire/désallocations?

J'ai un cas que j'ai besoin de créer TSQLConnection et TSQLDataSet pour interroger les données de 5 tables de la base de données, chaque table a plus de 10000 enregistrements. Je vais donc créer 5 threads, chaque thread accepte un nom de table comme paramètre via le constructeur. Malheureusement, je ne peux pas obtenir plus de différence évidente de temps pris. J'ai écrit les codes suivants:


TMyThread = class(TThread) 
private 
    FTableName: string; 
protected 
    procedure Execute; override; 
public 
    constructor Create(const CreateSuspended: Boolean; const aTableName: string); 
    reintroduce; overload; 
end; 

constructor TMyThread.Create(const CreateSuspended: Boolean; const aTableName); 
begin 
    inherited Create(CreateSuspended); 
    FTableName := aTableName; 
    FreeOnTerminate := True; 
end; 

procedure TMyThread.Execute; 
var C: TSQLConnection; 
    D: TDataSet; 
begin 
    C := NewSQLConnection; 
    try 
    D := NewSQLDataSet(C, FTableName); 
    try 
     D.Open; 
     while not D.Eof do begin 
     // Do something 
     D.Next; 
     end; 
    finally 
     D.Free; 
    end; 
    finally 
    C.Free; 
    end; 
end; 

function NewSQLConnection: TSQLConnection; 
begin 
    Result := TSQLConnection.Create(nil); 

    // Setup TSQLConnection 
end; 

function NewSQLDataSet(const aConn: TSQLConnection; const aTableName: string): 
    TSQLDataSet; 
begin 
    Result := TSQLDataSet.Create(aConn); 
    Result.CommandText := Format('SELECT * FROM %s', [aTableName]); 
    Result.SQLConnection := aConn; 
end; 

Existe-t-il un conseil ou une recommandation pour ce cas?

+0

À quelle base de données êtes-vous connecté? Est-ce distant ou local? –

+0

Je me connecte à la base de données firebird en tant qu'hôte local. – lmengyew

+0

Pouvez-vous afficher le graphique CPU de votre application et de Firebird? (utiliser l'explorateur de processus pour cela) –

Répondre

2

Ma première chose à faire est de regarder le temps CPU. Où est le goulot d'étranglement: votre application utilise-t-elle 100% CPU en mode mono-utilisateur, alors le multi-thread ne fonctionnera pas (seulement sur dual/quad core). Mais si votre application en mode multithread n'utilise pas beaucoup de CPU, vous pourriez avoir un autre goulot d'étranglement: par exemple, le serveur DB utilise peut-être 100% CPU? Ou votre serveur HD est lent? Ou réseau lent? Ou peut-être même que le pilote de base de données DBExpress n'est pas multithread, donc il n'utilise que 1 thread à la fois (vous remarquerez un CPU faible sur le client et le serveur sur multicore). A propos: oui, vous devriez toujours essayer de minimiser les allocations de mémoire. FastMM n'est pas le meilleur MM pour le multithread lourd: ne s'adapte pas très bien sur multicore (vous aurez jamais voir 100% CPU dans la mémoire des applications lourdes). Mais rien de déranger dans les applications normales. Seulement si tel est le cas, vous pouvez essayer TopMM: (?) Un peu plus lent, mais des échelles beaucoup mieux: http://www.topsoftwaresite.nl/Downloads/TopMemory.pdf

+0

Merci pour votre réponse. – lmengyew

0

En fait, je voudrais voir une CPU GRAPH avec Process Explorer, comme l'étape 4 de cette page: Parce qu'il montre CPU + mem + IO (!) Dans le temps. S'il vous plaît de l'application de test et firebird.

Je pense que firebird est lié par IO (votre HD), parce que dans votre première capture d'écran CPU, les deux ont un faible CPU. Peut-être que vous pouvez augmenter le cache mémoire de Firebird?

Btw: combien de cœurs/cpu avez-vous?

+0

OK, j'essaye de télécharger le graphique de CPU encore. Ma machine est de 8 cœurs. – lmengyew

+0

CPU Graphique (MyProject et Firebird): http://i257.photobucket.com/albums/hh240/lmengyew/Multithread/multithread3.jpg – lmengyew

1

Aha! Vous avez dit que vous utilisez SuperServer?

Firebird 1.5 Serveur classique vs Superserver
SuperServer: Pas de support SMP. Sur les machines Windows multi-processeurs, les performances peuvent même chuter de manière spectaculaire lorsque le système d'exploitation bascule le processus entre les processeurs. Pour éviter cela, définissez le paramètre CpuAffinityMask dans le fichier de configuration firebird.conf.

Il utilise donc seulement 1 cœur. Vous devez utiliser Classic Server (processus par connexion). Firebird n'a pas encore de véritable support SMP, sera en version 3.0: http://tracker.firebirdsql.org/browse/CORE-775

+0

Signification pour superserver, peu importe que j'ai réglé le cpuaffinitymask à 8 cœurs, je peux encore Ne pas prendre le temps évident pour la situation multi-threads? – lmengyew

+0

Oui, superserver ne peut utiliser qu'un seul cœur. Le serveur Classis peut utiliser des multicœurs car chaque connexion reçoit son propre processus (mais chaque processus ou connexion est à nouveau unique) –