当前位置: 首页 > 知识库问答 >
问题:

使用异步总是使C++代码更快吗

申屠昌胤
2023-03-14

在C++中使用异步函数总是一个好主意吗?

我的意思是,很多时候,我们可能需要做一些简单的事情,比如做一个函数,返回天气,不是素数,等等,那么,这会使C++代码更快还是更慢呢?

//示例代码


#include <iostream>
#include <future>
using namespace std;
bool AsyncTest(int n){
    //do some stuffs    
    return true;
}
int main(int argc, char *argv[])
{
    for(int i=1;i<=10;i++){
        future<bool>ans=async(launch::async,AsyncTest,i);
        cout<<ans.get()<<endl;
    }
}

感谢阅读

共有1个答案

师向文
2023-03-14

这很大程度上取决于你的情况。

我将描述几种情况。

情况一:所有任务处理起来都非常迅速。与创建不同线程所面临的开销相比,所有计算时间的总和是很小的。

->你将获得没有、很少甚至是负的速度提升。

情况二:所有任务都需要很长时间。

->你可能会得到一个速度提升。

情况三:一个任务需要很长时间,其他的任务很快。

->如果并行计算其他任务,您可能不会得到速度提升,因为这并不重要。

情况4:任务需要共享资源(如文件访问)

->您可能不会得到速度提升,因为所有任务都必须等待才能获得对共享资源的独占访问权。

结论:

还有更多的情况可以发生。因此,为了将速度提升归档,您必须

  • 使用真实的测试用例(使用perf或vTune等工具)度量代码中的热点
  • 确定并行化热点的方法。
  • 再次测量
 类似资料:
  • 问题内容: 我们正在与节点合作,主要用于内部项目,并了解使用该技术的最佳方法。 并非来自特定的异步背景,学习曲线可能是一个挑战,但是我们已经习惯了框架和学习过程。 使我们两极分化的是,何时才是使用同步代码与异步代码的最佳时间。我们目前使用的规则是,如果任何东西与IO进行交互,那么它必须通过回调或事件发射器(即给定的)是异步的,但是可以将任何未使用IO的其他项构造为同步函数(此方法还将取决于函数本身

  • 假设我有以下内容: 然后我这样称呼它: 我省略了并且没有将声明为这一事实是否使它实际上是异步的? 我希望发生的情况是循环会立即完成,因为即使花费了很长时间,也不会被等待,并且会立即返回。 我认为这会导致文件内容在这样调用时被覆盖的问题,但这使我认为代码是以某种方式自动转换为同步代码的(尽管似乎不可能知道何时完成)。 那么,简单地说,从非异步方法调用函数是否会自动使代码同步执行,以及省略和(如在函数

  • 我在使用clang的代码完成机制时正在研究潜在的代码完成加速。下面描述的流程是我在Anders Bakken的rtages中发现的。 翻译单元由守护程序监控文件解析以查找更改。这是通过调用和相关函数(,)完成的。当用户在源文件中的给定行和列处请求完成时,守护程序将源文件的最后保存版本和当前源文件的缓存翻译单元传递到。(Clang Code完整文档)。 传递给(来自CompletionThread:

  • 使用Mocha测试异步代码并不简单!只需在测试完成后调用回调。通过添加一个回调(通常命名done)it(),Mocha将知道它应该等待调用此函数来完成测试。此回调接受Error实例(或其子类)或伪值; 其他任何事情都会导致测试失败。 describe('User', function() { describe('#save()', function() { it('should save wi

  • 问题内容: 我有类似的东西: 设置状态仍然是异步的,那么等待此调用完成的最佳方法是什么? 本似乎并没有接受一个回调像使用。 一个例子 基于类 转换为基于功能的 在上面,我们要顺序运行每个setWhatever调用。这是否意味着我们需要设置许多不同的useEffect挂钩来复制此行为? 问题答案: 状态更新完成后,setter不会提供回调,就像React类组件中的setState一样。为了复制相同的

  • 我有点像: 设置状态仍然是异步,那么等待这个调用完成的最佳方法是什么? 似乎不像那样接受回调。 在上面,我们希望按顺序运行每个setwhater调用。这是否意味着我们需要设置许多不同的useEffect挂钩来复制这种行为?