从上面的答案来看,意味着如果我的线程中有创建对象,我将面临内存分配/解除分配的瓶颈?
我有一个案例,我需要创建TSQLConnection和TSQLDataSet来查询数据库的5个表中的数据,每个表有超过10000条记录。所以我将创建5个线程,每个线程通过构造函数接受一个tablename作为参数。不幸的是,我无法获得更明显的时间差异。我写了以下代码:
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;
对此案件有任何建议或建议吗?
答案 0 :(得分:2)
我应该做的第一件事:看看CPU时间。瓶颈在哪里:您的应用程序是在单用户模式下使用100%CPU,然后多线程将无法工作(仅在双/四核上)。但是,如果你的多线程模式的应用程序没有使用太多的CPU,你可能会遇到另一个瓶颈:例如,数据库服务器可能使用100%的CPU?或者你的服务器HD很慢?还是慢网?或者甚至DBExpress数据库驱动程序也不是多线程的,所以它一次只使用1个线程(你会注意到多核上客户端和服务器上的CPU很低)。
顺便说一下:是的,你应该总是尽量减少内存分配。对于繁重的多线程,FastMM不是最好的MM:在多核上不能很好地扩展(你将从不在内存繁重的应用程序中看到100%的CPU)。但在普通的应用程序中没有什么可担心的。只有在这种情况下,你可以尝试使用TopMM:稍微慢一点(?)但是要更好地扩展: http://www.topsoftwaresite.nl/Downloads/TopMemory.pdf
答案 1 :(得分:1)
啊哈!你说你使用SuperServer?
Firebird 1.5 Classic Server vs. Superserver
的SuperServer: 没有SMP支持。在多处理器Windows机器上,当操作系统在CPU之间切换进程时,性能甚至会急剧下降。要防止这种情况,请在配置文件firebird.conf中设置CpuAffinityMask参数。
所以它只使用1个核心。您应该使用Classic Server(每个连接的进程)。 Firebird还没有真正的SMP支持,将在3.0版本中: http://tracker.firebirdsql.org/browse/CORE-775
答案 2 :(得分:0)
实际上我想在Process Explorer中看到一个CPU GRAPH ,就像本页的第4步: http://www.brightrev.com/how-to/windows/53-five-uses-for-sysinternals-process-explorer.html
因为它及时显示CPU + mem + IO(!)。请测试应用程序和firebird。
我认为firebird受IO(你的HD)的约束,因为在你的第一个CPU截图中,两者都有低CPU。也许你可以增加firebird内存缓存?
顺便说一下:你有多少核心/ CPU?