草庐IT

OPTIMIZATION

全部标签

c++ - 为什么我基于堆栈的代码实现比递归慢得多?

我有一棵树,其节点存储-1或非负整数,即顶点名称。每个顶点在树中最多出现一次。以下函数是我代码中的瓶颈:版本A:voidnode_vertex_members(node*A,vector*vertexList){if(A->contents!=-1){vertexList->push_back(A->contents);}else{for(inti=0;ichildren.size();i++){node_vertex_members(A->children[i],vertexList);}}}B版:voidnode_vertex_members(node*A,vector*verte

c++ - 为什么我基于堆栈的代码实现比递归慢得多?

我有一棵树,其节点存储-1或非负整数,即顶点名称。每个顶点在树中最多出现一次。以下函数是我代码中的瓶颈:版本A:voidnode_vertex_members(node*A,vector*vertexList){if(A->contents!=-1){vertexList->push_back(A->contents);}else{for(inti=0;ichildren.size();i++){node_vertex_members(A->children[i],vertexList);}}}B版:voidnode_vertex_members(node*A,vector*verte

c++ - 您如何解释缓存未命中的 cachegrind 输出?

出于好奇,我编写了几个不同版本的矩阵乘法并针对它运行了cachegrind。在下面的结果中,我想知道哪些部分是L1、L2、L3未命中和引用,它们的真正含义是什么?下面是我的矩阵乘法代码,以防万一有人需要。#defineSLOWEST==6933==Cachegrind,acacheandbranch-predictionprofiler==6933==Copyright(C)2002-2012,andGNUGPL'd,byNicholasNethercoteetal.==6933==UsingValgrind-3.8.1andLibVEX;rerunwith-hforcopyright

c++ - 您如何解释缓存未命中的 cachegrind 输出?

出于好奇,我编写了几个不同版本的矩阵乘法并针对它运行了cachegrind。在下面的结果中,我想知道哪些部分是L1、L2、L3未命中和引用,它们的真正含义是什么?下面是我的矩阵乘法代码,以防万一有人需要。#defineSLOWEST==6933==Cachegrind,acacheandbranch-predictionprofiler==6933==Copyright(C)2002-2012,andGNUGPL'd,byNicholasNethercoteetal.==6933==UsingValgrind-3.8.1andLibVEX;rerunwith-hforcopyright

c++ - 防止不必要的 C++ 仿函数对象拷贝

我有一个类,它收集有关一组对象的信息,并且可以充当仿函数或输出迭代器。这使我可以执行以下操作:std::vectorv;Fooconstx=std::for_each(v.begin(),v.end(),Joiner());和Fooconstx=std::copy(v.begin(),v.end(),Joiner());现在,理论上,编译器应该可以使用copyelisionandreturn-valueoptimizations因此只需要创建一个Joiner对象。然而,在实践中,该函数会创建一个用于操作的拷贝,然后将其复制回结果,即使在完全优化的构建中也是如此。如果我将仿函数创建为左值

c++ - 防止不必要的 C++ 仿函数对象拷贝

我有一个类,它收集有关一组对象的信息,并且可以充当仿函数或输出迭代器。这使我可以执行以下操作:std::vectorv;Fooconstx=std::for_each(v.begin(),v.end(),Joiner());和Fooconstx=std::copy(v.begin(),v.end(),Joiner());现在,理论上,编译器应该可以使用copyelisionandreturn-valueoptimizations因此只需要创建一个Joiner对象。然而,在实践中,该函数会创建一个用于操作的拷贝,然后将其复制回结果,即使在完全优化的构建中也是如此。如果我将仿函数创建为左值

c++ - std::hash_set vs std::unordered_set,它们是一回事吗?

我知道hash_set是非标准的,而unordered_set是标准的。但是,我想知道,性能方面,两者之间有什么区别?为什么要分开存在? 最佳答案 C++标准规定的unordered_容器的复杂性要求基本上没有为实现留下太多空间,它必须是某种哈希表。该标准是在充分意识到大多数供应商已经将这些数据结构作为扩展部署的情况下编写的。编译器供应商通常将这些容器称为“HashMap”或“哈希集”,这可能是您所指的(标准中没有文字std::hash_set,但是我认为GCC在单独的命名空间中有一个,对于其他编译器也是如此)。编写新标准时,作者希

c++ - std::hash_set vs std::unordered_set,它们是一回事吗?

我知道hash_set是非标准的,而unordered_set是标准的。但是,我想知道,性能方面,两者之间有什么区别?为什么要分开存在? 最佳答案 C++标准规定的unordered_容器的复杂性要求基本上没有为实现留下太多空间,它必须是某种哈希表。该标准是在充分意识到大多数供应商已经将这些数据结构作为扩展部署的情况下编写的。编译器供应商通常将这些容器称为“HashMap”或“哈希集”,这可能是您所指的(标准中没有文字std::hash_set,但是我认为GCC在单独的命名空间中有一个,对于其他编译器也是如此)。编写新标准时,作者希

c++:如何优化IO?

我正在研究一个数学问题,它的优势是能够“预先计算”大约一半的问题,将此信息保存到文件中,然后多次重复使用它来计算我的问题的各种“实例”.困难在于上传所有这些信息以解决实际问题是一个主要瓶颈。更具体地说:我可以预先计算大量信息-大量的概率(longdouble),大量的std::map,等等-并将所有这些内容保存到磁盘(几个Gb)。我的程序的后半部分接受一个输入参数D。对于每个D,我需要执行大量计算,这些计算涉及预先计算的数据(来自文件)和其他一些特定于D的数据的组合(这样每个D的问题都不同)。有时我需要从文件中挑选出某些预先计算的信息。其他时候,我需要上传(大)文件中的每条数据。有什么

c++:如何优化IO?

我正在研究一个数学问题,它的优势是能够“预先计算”大约一半的问题,将此信息保存到文件中,然后多次重复使用它来计算我的问题的各种“实例”.困难在于上传所有这些信息以解决实际问题是一个主要瓶颈。更具体地说:我可以预先计算大量信息-大量的概率(longdouble),大量的std::map,等等-并将所有这些内容保存到磁盘(几个Gb)。我的程序的后半部分接受一个输入参数D。对于每个D,我需要执行大量计算,这些计算涉及预先计算的数据(来自文件)和其他一些特定于D的数据的组合(这样每个D的问题都不同)。有时我需要从文件中挑选出某些预先计算的信息。其他时候,我需要上传(大)文件中的每条数据。有什么