
1 AnroZ 1 天前 step0 干了什么?代码没看到,没办法帮忙分析。 单独开个三个后台线程没什么问题,但每个人都这么想会有问题,应该有资源分配限制吧? |
2 RinGress 1 天前 没代码不好说。 能想到的是核间通信延迟、cache 命中降低,额外开销切换等方面因素。 |
3 Ainokiseki OP |
4 darklinden 23 小时 50 分钟前 如果你 step0 为了多线程使用做了大内存数据的复制,而单线程时只读/无冲突所以用了同一数据,可能 io 耗时超过计算减少的耗时的吧 |
5 JoeJoeJoe PRO 感觉 op 这个不太适合这么拆分优化. 如果有前后依赖关系的话, 感觉应该把 step0-3 打包起来放在一个线程里面执行, 再来任务的话就再起一个线程执行 step0-3. |
6 MrVito 23 小时 33 分钟前 你试下绑核吧,说不定有奇效 |
7 AnroZ 23 小时 26 分钟前 整体看还行吧,原来执行要花 17.5s ,现在 14s 。 如果你的 step 里涉及到 io 操作的话,测试时间本来就有一定的随机性。 建议,测 100+次,会更好一些 |
8 RinGress 23 小时 15 分钟前 |
9 Building 23 小时 10 分钟前 via iPhone 这个要看多线程任务和访问的数据是不是互相独立的,否则访问时会产生多次拷贝和加锁,相比单线程会更加耗时 |
10 sjkdsfkkfd 22 小时 1 分钟前 需要具体看 step1,2,3 在干啥。通用的来讲,你可以使用自顶向下的微架构分析方法来一层层看问题在什么地方,推荐阅读 《现代 CPU 性能分析与优化》 这本书 |
11 jones2000 21 小时 18 分钟前 设计有问题。 上锁了, 避免用锁。锁很耗时间的。 |
12 minami 21 小时 13 分钟前 不了解你的各个 step 怎么拆分的,但是如果你需要主线程等待所有消费者线程运行结束的话,建议用 openmp/tbb ,别自己写 |
13 Ainokiseki OP |
14 minami 21 小时 4 分钟前 @Ainokiseki #13 不能这么写,你要用事件等。首先你每个子线程间不能有锁,其次你要给每个子线程注册一个完成的事件,然后在主线程用 WaitForMultipleObjects 之类的机制去等所有事件完成 |
15 ivan_wl 21 小时 2 分钟前 后台线程和主线程是不同的 cpu 吗 |
16 chashao 20 小时 50 分钟前 @sjkdsfkkfd 感谢分享这本书 ![]() |
17 MrVito 20 小时 44 分钟前 @Ainokiseki task 做完以后是 notify_one 还是 notify_all ?有可能惊群了 |
18 unused 20 小时 37 分钟前 看看是不是 NUMA 的问题,profiling 可以再细一点 |
19 bluearc 18 小时 35 分钟前 @Ainokiseki #3 意思是每次回到 step0 后,线程池中就没有任务了吗?那我觉得这里还可以优化一下(但看描述似乎下一个 step0 必须在上一个 step 执行完成后才能启动?),开一个大的线程池,把 step0 包装一下也扔到线程池里,step 执行完后启动 task2 ,3 的时候传一个回调函数进去,同时设计一个数据结构至少包含一个 atomic<size_t>来同步状态(如果能用 C++20 那可以用 latch ),比如初值为 2 ,task2 ,3 执行完成后就 fetchsub ,再检查值是否为零,如果是 0 就把回调扔到线程池里。 但 step 单线程和多线程下用时增长,倒也没什么思路,不如换个机器测测,或者像上面说的构造多个不同的数据多测几百次统计平均值 |
20 setname 1 小时 29 分钟前 1. 换无锁队列,有可能是检查队列的时候造成的顺序堵塞 2. 检查一下 task 结束的时候有没有释放资源 3. vector 扩容时间可能比较长,可以做一套流控,使用固定大小队列,可以减少资源消耗 |