DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: tigerleentu
今日帖子: 9
在线用户: 32
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 stacker (OOP才是王道) ★☆☆☆☆ -
普通会员
2022/9/5 7:04:42
标题:
为什么单线程比多线程还快? 浏览:1438
加入我的收藏
楼主: 为什么单线程还快过多线程?
此帖子包含附件:stacker_2022957442.zip 大小:135.7K
----------------------------------------------
-
作者:
男 stacker (OOP才是王道) ★☆☆☆☆ -
普通会员
2022/9/5 7:05:41
1楼: 多线程例子
此帖子包含附件:stacker_2022957541.zip 大小:135.6K
----------------------------------------------
-
作者:
男 stacker (OOP才是王道) ★☆☆☆☆ -
普通会员
2022/9/5 7:07:02
2楼: 是因为数据不够大的原因吗?
----------------------------------------------
-
作者:
男 pp0123 (pp0123) ★☆☆☆☆ -
普通会员
2022/9/5 8:15:29
3楼: 每一个线程的工作量一样.
但你还要开多个线程, 夸线程传出与收集数据.
这些动作也要时间哦.
----------------------------------------------
-
作者:
男 ultramund (ultramund) ★☆☆☆☆ -
普通会员
2022/9/5 8:16:00
3楼: 先要搞懂单线程多线程的概念,多线程并不是比单线程快,而是多线程可以同时处理多个任务,如果你的任务只有一个,除非你将这个任务分作多段让多线程执行,否则,这种比较没有可比性。
举个例子,现在有一公里路程,规则是:你一个人跑完这一公里,对方是10个人各跑100米加起来就算跑完。尽管这10个人可能都比你跑得慢,但显然你跑不赢对方
----------------------------------------------
QQ:56524722 老衲决定重出江湖。
作者:
男 tuesdays (Tuesday) ▲▲▲▲△ -
普通会员
2022/9/5 9:02:53
4楼: 报上CPU型号.
----------------------------------------------
delphi界写python最强, python界写delphi最强. 写自己的代码, 让别人去运行.
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2022/9/5 9:11:51
5楼: if 1 process needs 10ms, 1 div 10 = needs wait 10ms to show the resulted!

 TTask.WaitForAll(Tasks);  --> wait for "ALL" before show the resulted!

now, if you use "WaitForANY(...)", then, the resulted is showed at first and dont wait for rest...
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2022/9/5 9:14:03
6楼: try use "IFUTURE" (instead ITask)  for catch the resulted like this!
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2022/9/5 9:16:32
7楼: fixing..... sorry my fault!!!
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
男 hs_kill (lzl_17948876) ★☆☆☆☆ -
普通会员
2022/9/5 9:33:00
8楼: 单线程和多线程, 在线程内部速度没区别, 问题在于多线程多了线程切换及数据同步的耗时

你这代码多线程每计算一次都要同步, 同步时其他线程如果也同步就需要互相等待, 这都是耗时
而且10个线程的切换开销相比单线程的执行体来说也太大了

首先你要优化下自己的线程代码, 不要每计算一个都要同步, 等线程内计算完毕最后同步一次就行, 我用你的代码测试, 原来要370ms 改为线程结束后同步一次, 耗时降到140ms
      Tasks[I] := TTask.Create(
        procedure()
        var
          ThreadedI: Integer;
          lSum: Integer; //内部变量进行累加计算
        begin
          lSum := 0;
          for ThreadedI := 0 to Pred(1000000) do
          begin
          Inc(lSum, 1); //内部计算

          end;
          TInterlocked.Add(SumValue, lSum); //计算结束后同步一次
        end);



另外就是你测试代码每次循环的执行逻辑太简单了, 导致线程切换开销显得很大
你把循环执行放慢一点, 比如加上sleep(1), 就能体现出多线程处理的优势了
----------------------------------------------
http://www.cnblogs.com/lzl_17948876/
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2022/9/5 9:46:06
9楼:   MyText: string;
  XValue: TStringList;
begin
  SumValue := 0;
  SetLength(Tasks, 10);
  //
  (Sender as TButton).Enabled := False;
  //
  ElapsedTime := GetTickCount;
  //
  XValue := TStringList.Create;
  try
    for I := 0 to 9 do
      begin
        Tasks[I] := TTask.Create(
          procedure()
          var
          ThreadedI: Integer;
          GTick: cardinal;
          ID: string;
          begin
          ID := TThread.CurrentThread.ThreadID.ToString;
          GTick := GetTickCount;
          for ThreadedI := 0 to (1000000 - 1) do
          begin
          TInterlocked.Add(SumValue, 1);
          end;
          //
          XValue.AddPair(ID, (GetTickCount - GTick).ToString);
          end);
      end;
    //
    for I := 0 to Pred(10) do
      Tasks[I].Start; // Start Created Thread
    //
    TTask.WaitForAll(Tasks);
    ElapsedTime := GetTickCount - ElapsedTime;
    //
    MyText := '';
    for var MyItem in XValue do
      MyText := MyText + MyItem + sLineBreak;
    //
    ShowMessage(MyText);
此帖子包含附件:
PNG 图像
大小:15.0K
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
男 stacker (OOP才是王道) ★☆☆☆☆ -
普通会员
2022/9/5 10:33:14
10楼: 把多线程改成八楼那样的,就比单线程快了。
----------------------------------------------
-
作者:
男 stacker (OOP才是王道) ★☆☆☆☆ -
普通会员
2022/9/5 10:35:39
11楼: 但是多线程的ElapsedTime有时会抓不太到。
----------------------------------------------
-
作者:
男 stacker (OOP才是王道) ★☆☆☆☆ -
普通会员
2022/9/5 10:43:49
12楼: sleep不能用,有Bug
----------------------------------------------
-
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
2022/9/5 13:21:53
13楼: 八楼经验老道啊。

这么凶狠吗 多线程竞争这么激烈
官方的列子能榨不少cpu
我自己根据官方写的 
单 
多 
多也就快了 1.5倍   四线程cpu
还是没学到精髓啊。。
----------------------------------------------
[alias]  co = clone --recurse-submodules  up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/>http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
作者:
男 sail2000 (小帆工作室) ★☆☆☆☆ -
盒子活跃会员
2022/9/5 13:29:03
14楼: 多线程善用消息处理,高速路多车道才不会拥堵。
----------------------------------------------
delphi 是兴趣,和工作无关,即使它倒闭。又不靠它 delphi 吃饭,怕甚?
作者:
男 doersoft (hnysoft.com) ★☆☆☆☆ -
普通会员
2022/9/5 13:42:23
13楼: 试试协程~~~
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行97.65625毫秒 RSS