I希望确保所请求的计算完全按照我指定的顺序执行,而不对编译器或CPU (包括链接器、汇编程序和您能想到的任何其他东西)进行任何更改。
在C语言中假定运算符从左到右结合。
我使用的是C(可能还对C++解决方案感兴趣),它指出,对于优先级相等的运算,有一个假定的左到右操作符结合性,因此
a = b + c - d + e + f - g ...;
等于
a = (...(((((b + c) - d) + e) + f) - g) ...);
一个小例子
但是,请考虑以下示例:
double a, b = -2, c = -3;
a = 1 + 2 - 2 + 3 + 4;
a += 2
我有一些带有循环的C代码:
for(int i=0; i<1000; i+=ceil(sqrt(i)))
{
do stuff that could benefit from loop unrolling;
}
我打算使用宏命令告诉GCC展开循环,但我想确保在这种情况下它确实会展开循环(因为增量不是1,但它仍然可以预处理和展开)。
可以让GCC在经过优化后输出包含代码的.C文件吗?(希望包括在程序集级优化之前使用-O进行的任何优化)?
我知道我可以使用程序集输出来确认这一点,但我更希望在C中看到一些东西--对我来说,阅读和理解起来要容易得多。
假设我有一种语言,我可以像这个过于简单的例子一样输入表达式:
if A() > B() then A() else B() end
因此,A()和B()是函数,表达式返回两者中较大的一个。天真的评估方法是同时调用A和B,然后再次调用两者中最大的一个。因此,如果A返回10,B返回20,则B更大,并且将被调用两次。
我想实现的是一种机制,因为A()和B()是确定性的(总是给出相同的结果),所以表达式可以重写为:
tmpA = A()
tmpB = B()
if tmpA > tmpB then tmpA else tmpB end
这段代码只会调用A和B一次,如果两者都同样昂贵,这将节
我一直在阅读有效的Java,3/E。
在阅读有关hashcode的部分时(第51页),我注意到这本书说
31的一个很好的特性是可以用移位和减法来代替乘法,以便在某些体系结构上获得更好的性能:31 * i == (i << 5) - i。现代VM自动进行这种优化。
我觉得这是有道理的。我想知道当这种优化发生时,代码会变得多快。因此,我编写了一个简短的代码来查看这种优化的影响。
但是,似乎没有明显的差别。因此,我编写了更简单的代码,以检查这种优化是否已经发生。
下面是我的示例代码。
fun main() {
val num = Random.nextInt()
我正在探索C++20中的移动语义,使用霍顿和Van的“起始C++20从新手到专业人员”。我使用MSVisualStudio2022版本17.2.5作为我的IDE,我在"C/C++ ->优化“下尝试了几个不同的编译器优化选项,它们似乎没有任何影响。当前选择的选项是“最大优化(偏好大小) (/O1)”,应该发生的情况是,1000元素数组被移动的次数从20次减少到10次,如程序的输出所示:
如果编译器使用移动构造函数,“移动的1000个元素数组”只应打印10次。
Array of 1000 elements moved
Array of 1000 elements moved
Arra
我一直在用gcc编译我的C/C++代码,然而直到最近我才意识到它并不是唯一的免费编译器。
我一直在尝试切换,因为其他一些编译器,特别是clang,似乎表现出了很大的潜力。我的编译器的标准是立即符合C99标准,并且随着标准变得越来越普遍,以及它是免费和开源的,并尽可能优化地编译我的代码。快速编译对我来说不是那么重要,但总是一个很好的加分。也就是说,如果有任何编译器看起来可能很快就会超过gcc,我想知道现在为了学习而切换一下是否值得。
我将主要使用它来编译C++代码,所以这对我来说比C更优先。我将在linux for linux上构建,所以一个好的CLI是必须的。我不介意一定程度的不稳定性,只要二
我发现CompilerOption中的一些选项不能导出到命令行。
例如,闭包编译器的Java API CompilerOption中提供了alias all strings,但我不知道如何在命令行中设置它。
我知道我可以创建一个新的java类,比如:
Compiler c = new Compiler();
ComppilerOptions opt = new ComppilerOptions();
opt.setAliasAllString(true);
c.compile(.....);
但是,我必须自己处理命令行参数。
有什么简单的想法吗?
======================
为了在工作中进行演示,我想将NodeJS的性能与C进行比较,以下是我所写的:
Node.js (for.js):
var d = 0.0,
start = new Date().getTime();
for (var i = 0; i < 100000000; i++)
{
d += i >> 1;
}
var end = new Date().getTime();
console.log(d);
console.log(end - start);
C(for.c.c)
#include <stdio.h>
#include <time.h
简单地在python和C++中运行一个近乎空的for循环(如下所示),速度是非常不同的,python慢了一百多倍。
a = 0
for i in xrange(large_const):
a += 1
int a = 0;
for (int i = 0; i < large_const; i++)
a += 1;
另外,我能做些什么来优化python的速度呢?
(另外:在这个问题的第一个版本中,我在这里做了一个糟糕的例子,我并不是说a=1,以便C/C++编译器可以优化它,我的意思是循环本身消耗了大量的资源(也许我应该使用a+=1作为例子)。我所说的如何优化的意思是,如果for循环
我一直在学习C++,并出于好奇对此进行了编程:
#include <iostream>
class A {};
class B {
public:
~B() {}
};
A get_a() {
A a;
std::cout << &a << '\n';
return a;
}
B get_b() {
B b;
std::cout << &b << '\n';
return b;
}
int main()