这是一段看似非常特殊的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++ 11中的lambda表达式?我什么时候用?他们解决了哪些问题在引入之前是不可能的?
一些示例和用例将是有用的.
在C/C++(以及该系列的许多语言)中,根据条件声明和初始化变量的常用习惯用法是使用三元条件运算符:
int index = val > 0 ? val : -val
Run Code Online (Sandbox Code Playgroud)
Go没有条件运算符.实现上述相同代码的最惯用方法是什么?我来到以下解决方案,但它似乎相当冗长
var index int
if val > 0 {
index = val
} else {
index = -val
}
Run Code Online (Sandbox Code Playgroud)
还有更好的东西吗?
我个人是三元运算符的拥护者:()?:; 我确实意识到它有它的位置,但我遇到了许多完全反对使用它的程序员,而且有些人经常使用它.
你有什么感受?你看到了什么有趣的代码?
在阅读了这篇文章后(在StackOverflow上回答)(在优化部分),我想知道为什么条件移动不容易受到分支预测失败的影响.我在一篇关于cond移动的文章中找到了(PDF由AMD提供).在那里,他们声称cond的性能优势.移动.但为什么会这样呢?我没有看到它.在评估ASM指令的时刻,前面的CMP指令的结果尚未知晓.
谢谢.
optimization performance assembly cpu-architecture branch-prediction
条件运算符需要什么?在功能上它是多余的,因为它实现了if-else结构.如果条件运算符比等效的if-else赋值更有效,为什么编译器不能更有效地解释if-else?
我对直接赋值和三元条件运算符优先级感到困惑:
#include<stdio.h>
int main(void)
{
int j, k;
j = k = 0;
(1 ? j : k) = 1; // first
printf("%d %d\n", j, k);
j = k = 0;
1 ? j : k = 1; // second
printf("%d %d\n", j, k);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望输出为:
1 0
1 0
Run Code Online (Sandbox Code Playgroud)
但它碰巧是:
1 0
0 0
Run Code Online (Sandbox Code Playgroud)
另外我得到这个警告:
main.cpp:20:warning:语句无效
这是我评论的第二行.
由于直接赋值运算符的优先级低于三元条件运算符,因此我期望将第一行和第二行注释为等效的行.但实际情况并非如此.
我用g ++ --version(Ubuntu 4.4.3-4ubuntu5)4.4.3尝试了这个
我正在浏览一些代码,我发现了一些三元运算符.这段代码是我们使用的库,它应该非常快.
我在想,除了那里的空间,我们还要保存任何东西.
你有什么经历?
所以我很好奇是否有一个简短的声明:
if(number < 0 )
bigInt.sign = 0;
else
bigInt.sign = 1;
Run Code Online (Sandbox Code Playgroud)
如果a <b等,我会看到所有这些简短陈述.
我不确定如何正确地做到这一点,并希望得到一些意见.
谢谢!
我实际上只是在你们回答之前弄明白了.
我正在使用 bigInt.sign = (number < 0) ? 1 : 0
因此,在一位同事的建议下,我刚刚测试了三元运算符和等效的If-Else块之间的速度差异......似乎三元运算符产生的代码比If-Else快1到2倍.我的代码是:
gettimeofday(&tv3, 0);
for(i = 0; i < N; i++)
{
a = i & 1;
if(a) a = b; else a = c;
}
gettimeofday(&tv4, 0);
gettimeofday(&tv1, 0);
for(i = 0; i < N; i++)
{
a = i & 1;
a = a ? b : c;
}
gettimeofday(&tv2, 0);
Run Code Online (Sandbox Code Playgroud)
(抱歉使用gettimeofday而不是clock_gettime ......我会尽力改善自己.)
我尝试改变我对块进行计时的顺序,但结果似乎仍然存在.是什么赋予了?此外,If-Else在执行速度方面表现出更多的可变性.我应该检查gcc生成的程序集吗?
顺便说一句,这都是在优化级别零(-O0).
我是在想象这个,还是有些东西我没有考虑到,或者这是机器相关的东西,还是什么?任何帮助表示赞赏.
c++ ×6
performance ×3
if-statement ×2
optimization ×2
assembly ×1
c ×1
c++-faq ×1
c++11 ×1
go ×1
java ×1
lambda ×1
multilingual ×1
operators ×1