我总是想知道为什么编译器无法弄清楚对人眼来说显而易见的简单事物.他们做了很多简单的优化,但从来没有一点甚至有点复杂.例如,此代码在我的计算机上大约需要6秒才能打印零值(使用java 1.6):
int x = 0;
for (int i = 0; i < 100 * 1000 * 1000 * 1000; ++i) {
x += x + x + x + x + x;
}
System.out.println(x);
Run Code Online (Sandbox Code Playgroud)
很明显,x永远不会改变,所以无论你多久给自己添加0,它就会保持为零.因此编译器理论上可以用System.out.println(0)替换它.
或者甚至更好,这需要23秒:
public int slow() {
String s = "x";
for (int i = 0; i < 100000; ++i) {
s += "x";
}
return 10;
}
Run Code Online (Sandbox Code Playgroud)
首先,编译器可能会注意到我实际上正在创建一个100000"x"的字符串,因此它可以自动使用s StringBuilder,甚至更好地直接用结果字符串替换它,因为它总是相同的.其次,它没有意识到我根本没有使用该字符串,因此整个循环可能被丢弃!
为什么在这么多人力进入快速编译器之后,他们仍然是如此相对愚蠢?
编辑:当然这些是永远不应该在任何地方使用的愚蠢的例子.但每当我必须将一个漂亮且非常易读的代码重写为不可读的代码以便编译器很开心并生成快速代码时,我想知道为什么编译器或其他一些自动化工具不能为我做这项工作.
假设我有一些每类数据:(AandB.h)
class A
{
public:
static Persister* getPersister();
}
class B
{
public:
static Persister* getPersister();
}
Run Code Online (Sandbox Code Playgroud)
......还有很多课程.我想做的事情如下:
persistenceSystem::registerPersistableType( A::getPersister() );
persistenceSystem::registerPersistableType( B::getPersister() );
...
persistenceSystem::registerPersistableType( Z::getPersister() );
Run Code Online (Sandbox Code Playgroud)
......为每个班级.
我的问题是:有没有办法自动构建每类数据列表,这样我就不必枚举大块中的每个类型(如上例所示)?
例如,您可以这样做的一种方法是:(AutoRegister.h)
struct AutoRegisterBase
{
virtual ~AutoRegisterBase() {}
virtual void registerPersist() = 0;
static AutoRegisterBase*& getHead()
{
static AutoRegisterBase* head= NULL;
return head;
}
AutoRegisterBase* next;
};
template <typename T>
struct AutoRegister : public AutoRegisterBase
{
AutoRegister() { next = getHead(); getHead() = this; }
virtual void registerPersist()
{
persistenceSystem::registerPersistableType( T::getPersister() …Run Code Online (Sandbox Code Playgroud)