相关疑难解决方法(0)

为什么处理排序数组比处理未排序数组更快?

这是一段看似非常特殊的C++代码.出于某种奇怪的原因,奇迹般地对数据进行排序使得代码几乎快了六倍.

#include <algorithm>
#include <ctime>
#include <iostream>

int main()
{
    // Generate data
    const unsigned arraySize = 32768;
    int data[arraySize];

    for (unsigned c = 0; c < arraySize; ++c)
        data[c] = std::rand() % 256;

    // !!! With this, the next loop runs faster.
    std::sort(data, data + arraySize);

    // Test
    clock_t start = clock();
    long long sum = 0;

    for (unsigned i = 0; i < 100000; ++i)
    {
        // Primary loop
        for (unsigned c = 0; c < arraySize; ++c) …
Run Code Online (Sandbox Code Playgroud)

c++ java optimization performance branch-prediction

2万
推荐指数
27
解决办法
142万
查看次数

是否有编译器提示GCC强制分支预测始终以某种方式?

对于英特尔架构,是否有一种方法可以指示GCC编译器生成的代码总是强制分支预测在我的代码中采用特定方式?英特尔硬件是否支持此功能?那么其他编译器或硬件呢?

我会在C++代码中使用它,我知道我希望快速运行的情况,并且不关心当另一个分支需要被采取时,即使它最近采用了该分支.

for (;;) {
  if (normal) { // How to tell compiler to always branch predict true value?
    doSomethingNormal();
  } else {
    exceptionalCase();
  }
}
Run Code Online (Sandbox Code Playgroud)

作为Evdzhan Mustafa的后续问题,该提示是否可以在处理器第一次遇到指令时指定一个提示,所有后续的分支预测都能正常运行?

c++ gcc intel pragma branch-prediction

113
推荐指数
7
解决办法
2万
查看次数

便携式分支预测提示

有没有可行的分支预测提示方法?请考虑以下示例:

  if (unlikely_condition) {
    /* ..A.. */
  } else {
    /* ..B.. */
  }
Run Code Online (Sandbox Code Playgroud)

这有什么不同于:

  if (!unlikely_condition) {
    /* ..B.. */
  } else {
    /* ..A.. */
  }
Run Code Online (Sandbox Code Playgroud)

或者是使用编译器特定提示的唯一方法?(例如海湾合作委员会的__builtin_expect)

编译器会根据if条件的顺序对条件进行不同的处理吗?

c c++ compiler-construction optimization branch-prediction

38
推荐指数
4
解决办法
9589
查看次数

在某个位置或更低位置计算设置位的有效方法是什么?

给定std::bitset<64> bits任意数量的位和位位置X(0-63)

在X位或更低位计数位的最有效方法是什么,如果未设置X位,则返回0

注意:如果设置该位,则返回始终至少为1

蛮力方式很慢:

int countupto(std::bitset<64> bits, int X)
{
  if (!bits[X]) return 0;
  int total=1;
  for (int i=0; i < X; ++i)
  {
    total+=bits[i];
  }
  return total;
}
Run Code Online (Sandbox Code Playgroud)

这个count()方法bitset将为您popcount提供所有位,但bitset不支持范围

注意:这不是如何计算32位整数中的设置位数?因为它询问所有位而不是0到X的范围

c++ algorithm performance bit-manipulation

33
推荐指数
4
解决办法
5006
查看次数

Java性能提示

我有一个程序,我从C移植到Java.两个应用程序都使用快速排序来订购一些分区数据(基因组坐标).

Java版本运行速度很快,但我想让它更接近C版本.我正在使用Sun JDK v6u14.

显然我无法与C应用程序保持一致,但我想了解我能做些什么来尽可能地提高性能(在环境范围内).

我可以做些什么来测试应用程序的不同部分,内存使用情况等的性能?具体来说,我该怎么办?

另外,我可以实现哪些技巧(通常)来更改类和变量的属性和组织,减少内存使用并提高速度?

编辑:我使用Eclipse,显然更喜欢任何第三方工具的免费选项.谢谢!

java performance profiling

19
推荐指数
3
解决办法
1万
查看次数

gcc优化标志-O3使代码比-O2慢

我发现这个主题为什么处理排序数组比未排序数组更快?.并尝试运行此代码.而且我发现了奇怪的行为.如果我使用-O3优化标志编译此代码,则需要2.98605 sec运行.如果我用-O2它编译1.98093 sec.我尝试在同一环境中的同一台机器上运行此代码几次(5或6),我关闭所有其他软件(chrome,skype等).

gcc --version
gcc (Ubuntu 4.9.2-0ubuntu1~14.04) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Run Code Online (Sandbox Code Playgroud)

那么请你能解释一下为什么会这样吗?我阅读gcc手册,我看到-O3包括-O2.谢谢你的帮助.

PS添加代码

#include <algorithm>
#include <ctime>
#include <iostream>

int main()
{
    // Generate data
    const unsigned arraySize = 32768;
    int data[arraySize];

    for (unsigned …
Run Code Online (Sandbox Code Playgroud)

c++ optimization gcc

18
推荐指数
1
解决办法
5180
查看次数

C ++中的可移植分支预测提示

在StackOverflow上已经解决了两次分支预测的问题。但是,我没有找到想要的答案。
在优化阶段,我需要避免分支预测错误。我需要做一些验证。看起来像:

if(!successCondition)
    { throw Something(); }
Run Code Online (Sandbox Code Playgroud)

当然,在大多数情况下会发生的正常预期工作流中,我们不会抛出异常,因此也不会输入if。

我知道,在常见的if / else范例中,我们可以通过将最可能的分支放在if中,而将不太可能的分支放在else中来提示编译器(Portable分支预测提示)。但是我不想(由于可读性)链接ifs:

if(successCondition)
    { whatever(); }
else
    { throw Something(); }
Run Code Online (Sandbox Code Playgroud)

因此,我了解到,默认情况下,编译器将支持if中的条目,并且我会得到分支预测错误。

我知道gcc具有优化代码的特定功能,这在Linux内核中不太可能被调用(支持分支的编程)。但这不是可移植的,我需要编写代码。

有没有办法在C ++中具有可移植的正确分支预测?

c++ branch-prediction

5
推荐指数
1
解决办法
955
查看次数