草庐IT

OPTIMIZATION

全部标签

c++ - 在一组 27 个浮点值中选择中位数的最快代码 C/C++

这是众所周知的选择算法。见http://en.wikipedia.org/wiki/Selection_algorithm.我需要它来找到一组3x3x3体素值的中值。由于体积由十亿体素组成,并且算法是递归的,所以最好快一点。一般来说,可以预期值是比较接近的。迄今为止我尝试过的最快的已知算法使用快速排序分区函数。我想知道有没有更快的。我已经“发明”了一个使用两个堆的快20%的堆,但预期使用散列的一个更快。在实现此之前,我想知道是否已经存在Blitz快速解决方案。我使用float这一事实并不重要,因为在反转符号位后它们可以被视为无符号整数。订单将被保留。编辑:基准和源代码按照建议移到单独的

c++ - 为什么内联被认为比函数调用更快?

现在,我知道这是因为调用函数没有开销,但调用函数的开销真的那么重(并且值得将其内联的臃肿)?据我所知,当一个函数被调用时,比如f(x,y),x和y被压入堆栈,堆栈指针跳转到一个空block,并开始执行。我知道这有点过于简单化了,但我错过了什么吗?几次推送和跳转调用一个函数,真的有那么大的开销吗?如果我忘记了什么,请告诉我,谢谢! 最佳答案 除了没有调用(因此没有相关费用,例如调用前的参数准备和调用后的清理)这一事实之外,内联还有另一个显着优势。当函数体被内联时,它的主体可以在调用者的特定上下文中重新解释。这可能会立即让编译器进一步减

c++ - 为什么内联被认为比函数调用更快?

现在,我知道这是因为调用函数没有开销,但调用函数的开销真的那么重(并且值得将其内联的臃肿)?据我所知,当一个函数被调用时,比如f(x,y),x和y被压入堆栈,堆栈指针跳转到一个空block,并开始执行。我知道这有点过于简单化了,但我错过了什么吗?几次推送和跳转调用一个函数,真的有那么大的开销吗?如果我忘记了什么,请告诉我,谢谢! 最佳答案 除了没有调用(因此没有相关费用,例如调用前的参数准备和调用后的清理)这一事实之外,内联还有另一个显着优势。当函数体被内联时,它的主体可以在调用者的特定上下文中重新解释。这可能会立即让编译器进一步减

c - 返回 64 位整数中所有设置位的位置的最快方法是什么?

我需要一种快速的方法来获取64位整数中所有一位的位置。例如,给定x=123703,我想填充一个数组idx[]={0,1,2,4,5,8,9,13,14,15,16}.我们可以假设我们先验地知道位数。这将被称为1012-1015次,因此速度至关重要。到目前为止,我想出的最快的答案是以下怪物,它使用64位整数的每个字节作为表的索引,这些表给出了在该字节中设置的位数和这些位的位置:int64_tx;//thisistheinputunsignedcharidx[K];//thisisthearrayofKbitsthataresetunsignedchar*dst=idx,*src;unsi

c - 返回 64 位整数中所有设置位的位置的最快方法是什么?

我需要一种快速的方法来获取64位整数中所有一位的位置。例如,给定x=123703,我想填充一个数组idx[]={0,1,2,4,5,8,9,13,14,15,16}.我们可以假设我们先验地知道位数。这将被称为1012-1015次,因此速度至关重要。到目前为止,我想出的最快的答案是以下怪物,它使用64位整数的每个字节作为表的索引,这些表给出了在该字节中设置的位数和这些位的位置:int64_tx;//thisistheinputunsignedcharidx[K];//thisisthearrayofKbitsthataresetunsignedchar*dst=idx,*src;unsi

c++ - 存储未初始化的 STL vector ?

我正在编写一个内部循环,需要将structs放置在连续存储中。我不知道这些struct中有多少会提前。我的问题是STL的vector将其值初始化为0,所以无论我做什么,都会产生初始化成本加上设置struct成员的成本他们的值(value)观。有什么方法可以阻止初始化,还是有一个类似STL的容器,带有可调整大小的连续存储和未初始化的元素?(我确信这部分代码需要优化,而且我确信初始化是一笔不小的开销。)另外,请参阅下面的评论以了解初始化发生的时间。一些代码:voidGetsCalledALot(int*data1,int*data2,intcount){intmvSize=memberVe

c++ - 存储未初始化的 STL vector ?

我正在编写一个内部循环,需要将structs放置在连续存储中。我不知道这些struct中有多少会提前。我的问题是STL的vector将其值初始化为0,所以无论我做什么,都会产生初始化成本加上设置struct成员的成本他们的值(value)观。有什么方法可以阻止初始化,还是有一个类似STL的容器,带有可调整大小的连续存储和未初始化的元素?(我确信这部分代码需要优化,而且我确信初始化是一笔不小的开销。)另外,请参阅下面的评论以了解初始化发生的时间。一些代码:voidGetsCalledALot(int*data1,int*data2,intcount){intmvSize=memberVe

c++ - 在 C/C++ 中使用汇编语言

我记得在某处读到过,为了真正优化和加速代码的某些部分,程序员用汇编语言编写了该部分。我的问题是——这个练习还做吗?以及如何做到这一点?用汇编语言编写是不是有点太麻烦和过时了?当我们编译C代码(有或没有-O3标志)时,编译器会做一些代码优化&链接所有库&将代码转换为二进制目标文件。所以当我们运行程序时,它已经是最基本的形式,即二进制。那么诱导“汇编语言”有什么帮助呢?我正在尝试理解这个概念,非常感谢任何帮助或链接。更新:按照dbemerlin的要求改写第3点-因为您可能能够编写比编译器生成的更有效的汇编代码,但除非您是汇编专家,否则您的代码可能会运行得更慢,因为编译器通常比大多数人能更好

c++ - 在 C/C++ 中使用汇编语言

我记得在某处读到过,为了真正优化和加速代码的某些部分,程序员用汇编语言编写了该部分。我的问题是——这个练习还做吗?以及如何做到这一点?用汇编语言编写是不是有点太麻烦和过时了?当我们编译C代码(有或没有-O3标志)时,编译器会做一些代码优化&链接所有库&将代码转换为二进制目标文件。所以当我们运行程序时,它已经是最基本的形式,即二进制。那么诱导“汇编语言”有什么帮助呢?我正在尝试理解这个概念,非常感谢任何帮助或链接。更新:按照dbemerlin的要求改写第3点-因为您可能能够编写比编译器生成的更有效的汇编代码,但除非您是汇编专家,否则您的代码可能会运行得更慢,因为编译器通常比大多数人能更好

c++ - 现代 C++ 编译器的有效优化策略

我正在编写对性能非常关键的科学代码。代码的初始版本已经编写和测试,现在,有了分析器,是时候从热点开始剃须周期了。众所周知,一些优化,例如循环展开,如今由编译器比由程序员手动干预更有效地处理。哪些技术仍然值得?显然,我会通过探查器运行我尝试的所有操作,但如果有关于哪些方法有效哪些方法无效的传统智慧,这将为我节省大量时间。我知道优化非常依赖于编译器和架构。我正在使用面向Core2Duo的英特尔C++编译器,但我也对哪些适用于gcc或“任何现代编译器”感兴趣。以下是我正在考虑的一些具体想法:将STL容器/算法替换为手动容器/算法有什么好处?特别是,我的程序包含一个非常大的优先级队列(当前是s