type
tt=class(TThread)
procedure Execute; override;
end;
procedure tt.Execute;
var
S: string;
x: Cardinal;
begin
inherited;
with TIdHTTP.Create(nil) do
try
Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)';
x := GetTickCount;
S := Get('http://www.baidu.com');{线程创建越多,此处返回越慢}
OutputDebugString(PChar('---------Get耗时:'+IntToStr(GetTickCount-x) + '毫秒'));
finally
Free
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
o: TThread;
begin{只创建一个线程时,idhttp的Get返回最快}
o := tt.Create(False);
o := tt.Create(False);
o := tt.Create(False);
o := tt.Create(False);
o := tt.Create(False);
o := tt.Create(False);
o := tt.Create(False);
o := tt.Create(False);
end;
9 个解决方案
#1
正常,做一件事和同时做多件事,速度能一样快吗
#2
这个有什么奇怪的
你带宽为10M 你分成十份线程同时使用 分份线程只能用1M的带宽 差了十倍!
历来 I/O 就是最花时间的
你带宽为10M 你分成十份线程同时使用 分份线程只能用1M的带宽 差了十倍!
历来 I/O 就是最花时间的
#3
不奇怪,你网络带宽只有那么多
不过如果只有几个线程就变的很慢,那肯定不正常
不过如果只有几个线程就变的很慢,那肯定不正常
#4
带宽是有限的
#5
只创建一个线程是94ms,创建4个线程就是200多毫秒
#6
访问不同网站,可能会好一点
因为baidu可能对同一来源的访问加了限制
另外,真的到cpu瓶颈的时候,活动线程数大约cpu、核数,只会更慢
因为baidu可能对同一来源的访问加了限制
另外,真的到cpu瓶颈的时候,活动线程数大约cpu、核数,只会更慢
#7
如果线程多的话,每个线程工作的时间可能比CPU浪费在线程切换的时间还要少
#8
这么比较是不正确的
LZ代码稍微改下
打印结果
00000000 0.00000000 [9420] 开始GET2988
00000001 0.00177242 [9420] 开始GET8556
00000002 0.00231501 [9420] 开始GET8560
00000003 0.00274778 [9420] 开始GET8396
00000004 0.00312504 [9420] 开始GET9712
00000005 0.00395857 [9420] 开始GET4960
00000006 0.00574477 [9420] 开始GET9776
00000007 0.01052228 [9420] 开始GET7444
00000008 0.02655308 [9420] ---------Get耗时:15毫秒 THreadId:7444
00000009 0.02897992 [9420] ---------Get耗时:31毫秒 THreadId:9776
00000010 0.02924210 [9420] ---------Get耗时:31毫秒 THreadId:4960
00000011 0.23723039 [9420] ---------Get耗时:234毫秒 THreadId:8560
00000013 0.43633550 [9420] ---------Get耗时:437毫秒 THreadId:8396
00000014 0.43645748 [9420] ---------Get耗时:437毫秒 THreadId:2988
00000015 0.43934384 [9420] ---------Get耗时:437毫秒 THreadId:9712
00000016 0.44407922 [9420] ---------Get耗时:437毫秒 THreadId:8556
从打印出的LOG来看, 所有线程差不多都是先到 x := GetTickCount; 然后再开始GET,可能有的已经在GET了, 但是没完成。等于是都开始计时了, 但是这么多的线程,中间总会有时间片的切换, 所以消耗的时间比较多。
另外并不是LZ所说的, 第一个所消耗的时间比较少,你看到的第一个所消耗的时间, 并不一定是第一个你所创建的线程的,
如果上面的线程ID 7444, 最后进入, 反倒是最先结束, 这个具有随机性.
LZ代码稍微改下
with TIdHTTP.Create(nil) do
try
Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)';
x := GetTickCount;
OutputDebugStringA(PChar('开始GET' + IntToStr(GetCurrentThreadId)));
S := Get('http://www.baidu.com');{线程创建越多,此处返回越慢}
OutputDebugString(PChar('---------Get耗时:'+IntToStr(GetTickCount-x) + '毫秒 THreadId:' + IntToStr(GetCurrentThreadId)));
打印结果
00000000 0.00000000 [9420] 开始GET2988
00000001 0.00177242 [9420] 开始GET8556
00000002 0.00231501 [9420] 开始GET8560
00000003 0.00274778 [9420] 开始GET8396
00000004 0.00312504 [9420] 开始GET9712
00000005 0.00395857 [9420] 开始GET4960
00000006 0.00574477 [9420] 开始GET9776
00000007 0.01052228 [9420] 开始GET7444
00000008 0.02655308 [9420] ---------Get耗时:15毫秒 THreadId:7444
00000009 0.02897992 [9420] ---------Get耗时:31毫秒 THreadId:9776
00000010 0.02924210 [9420] ---------Get耗时:31毫秒 THreadId:4960
00000011 0.23723039 [9420] ---------Get耗时:234毫秒 THreadId:8560
00000013 0.43633550 [9420] ---------Get耗时:437毫秒 THreadId:8396
00000014 0.43645748 [9420] ---------Get耗时:437毫秒 THreadId:2988
00000015 0.43934384 [9420] ---------Get耗时:437毫秒 THreadId:9712
00000016 0.44407922 [9420] ---------Get耗时:437毫秒 THreadId:8556
从打印出的LOG来看, 所有线程差不多都是先到 x := GetTickCount; 然后再开始GET,可能有的已经在GET了, 但是没完成。等于是都开始计时了, 但是这么多的线程,中间总会有时间片的切换, 所以消耗的时间比较多。
另外并不是LZ所说的, 第一个所消耗的时间比较少,你看到的第一个所消耗的时间, 并不一定是第一个你所创建的线程的,
如果上面的线程ID 7444, 最后进入, 反倒是最先结束, 这个具有随机性.
#9
另外同时连接这么多给同一服务器,消耗时间多也是有关系的
#1
正常,做一件事和同时做多件事,速度能一样快吗
#2
这个有什么奇怪的
你带宽为10M 你分成十份线程同时使用 分份线程只能用1M的带宽 差了十倍!
历来 I/O 就是最花时间的
你带宽为10M 你分成十份线程同时使用 分份线程只能用1M的带宽 差了十倍!
历来 I/O 就是最花时间的
#3
不奇怪,你网络带宽只有那么多
不过如果只有几个线程就变的很慢,那肯定不正常
不过如果只有几个线程就变的很慢,那肯定不正常
#4
带宽是有限的
#5
只创建一个线程是94ms,创建4个线程就是200多毫秒
#6
访问不同网站,可能会好一点
因为baidu可能对同一来源的访问加了限制
另外,真的到cpu瓶颈的时候,活动线程数大约cpu、核数,只会更慢
因为baidu可能对同一来源的访问加了限制
另外,真的到cpu瓶颈的时候,活动线程数大约cpu、核数,只会更慢
#7
如果线程多的话,每个线程工作的时间可能比CPU浪费在线程切换的时间还要少
#8
这么比较是不正确的
LZ代码稍微改下
打印结果
00000000 0.00000000 [9420] 开始GET2988
00000001 0.00177242 [9420] 开始GET8556
00000002 0.00231501 [9420] 开始GET8560
00000003 0.00274778 [9420] 开始GET8396
00000004 0.00312504 [9420] 开始GET9712
00000005 0.00395857 [9420] 开始GET4960
00000006 0.00574477 [9420] 开始GET9776
00000007 0.01052228 [9420] 开始GET7444
00000008 0.02655308 [9420] ---------Get耗时:15毫秒 THreadId:7444
00000009 0.02897992 [9420] ---------Get耗时:31毫秒 THreadId:9776
00000010 0.02924210 [9420] ---------Get耗时:31毫秒 THreadId:4960
00000011 0.23723039 [9420] ---------Get耗时:234毫秒 THreadId:8560
00000013 0.43633550 [9420] ---------Get耗时:437毫秒 THreadId:8396
00000014 0.43645748 [9420] ---------Get耗时:437毫秒 THreadId:2988
00000015 0.43934384 [9420] ---------Get耗时:437毫秒 THreadId:9712
00000016 0.44407922 [9420] ---------Get耗时:437毫秒 THreadId:8556
从打印出的LOG来看, 所有线程差不多都是先到 x := GetTickCount; 然后再开始GET,可能有的已经在GET了, 但是没完成。等于是都开始计时了, 但是这么多的线程,中间总会有时间片的切换, 所以消耗的时间比较多。
另外并不是LZ所说的, 第一个所消耗的时间比较少,你看到的第一个所消耗的时间, 并不一定是第一个你所创建的线程的,
如果上面的线程ID 7444, 最后进入, 反倒是最先结束, 这个具有随机性.
LZ代码稍微改下
with TIdHTTP.Create(nil) do
try
Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)';
x := GetTickCount;
OutputDebugStringA(PChar('开始GET' + IntToStr(GetCurrentThreadId)));
S := Get('http://www.baidu.com');{线程创建越多,此处返回越慢}
OutputDebugString(PChar('---------Get耗时:'+IntToStr(GetTickCount-x) + '毫秒 THreadId:' + IntToStr(GetCurrentThreadId)));
打印结果
00000000 0.00000000 [9420] 开始GET2988
00000001 0.00177242 [9420] 开始GET8556
00000002 0.00231501 [9420] 开始GET8560
00000003 0.00274778 [9420] 开始GET8396
00000004 0.00312504 [9420] 开始GET9712
00000005 0.00395857 [9420] 开始GET4960
00000006 0.00574477 [9420] 开始GET9776
00000007 0.01052228 [9420] 开始GET7444
00000008 0.02655308 [9420] ---------Get耗时:15毫秒 THreadId:7444
00000009 0.02897992 [9420] ---------Get耗时:31毫秒 THreadId:9776
00000010 0.02924210 [9420] ---------Get耗时:31毫秒 THreadId:4960
00000011 0.23723039 [9420] ---------Get耗时:234毫秒 THreadId:8560
00000013 0.43633550 [9420] ---------Get耗时:437毫秒 THreadId:8396
00000014 0.43645748 [9420] ---------Get耗时:437毫秒 THreadId:2988
00000015 0.43934384 [9420] ---------Get耗时:437毫秒 THreadId:9712
00000016 0.44407922 [9420] ---------Get耗时:437毫秒 THreadId:8556
从打印出的LOG来看, 所有线程差不多都是先到 x := GetTickCount; 然后再开始GET,可能有的已经在GET了, 但是没完成。等于是都开始计时了, 但是这么多的线程,中间总会有时间片的切换, 所以消耗的时间比较多。
另外并不是LZ所说的, 第一个所消耗的时间比较少,你看到的第一个所消耗的时间, 并不一定是第一个你所创建的线程的,
如果上面的线程ID 7444, 最后进入, 反倒是最先结束, 这个具有随机性.
#9
另外同时连接这么多给同一服务器,消耗时间多也是有关系的