我对编译器和JIT优化的内部机制并不了解,但通常我会尝试使用“常识”来猜测哪些可以被优化,哪些不能。所以今天我写了一个简单的单元测试方法:
@Test // [Test] in C#
public void testDefaultConstructor() {
new MyObject();
}
这个方法实际上是我需要的。它检查默认构造函数是否存在并且能够正常运行,但是我开始考虑编译器/JIT优化的影响。编译器/JIT是否可以通过完全消除new MyObject();
语句来优化此方法?当然,它需要确定调用图没有对其他对象产生副作用的情况,这是普通构造函数的典型情况,它只是初始化对象的内部状态。
我认为只有JIT能够执行这种优化。这可能意味着我不必担心,因为测试方法只执行一次。我的假设正确吗?
尽管如此,我仍在思考这个一般性的主题。当我考虑如何防止此方法被优化时,我想我可以 assertTrue(new MyObject().toString() != null)
,但这非常依赖于toString()
方法的实际实现,即使如此,JIT也可能确定toString()
方法始终返回非空字符串(例如,如果实际上调用了Object.toString()
),从而优化整个分支。所以这种方式行不通。
我知道在C#中,可以使用[MethodImpl(MethodImplOptions.NoOptimization)]
,但这不是我真正寻找的。我希望找到一种(与语言无关的)方法,以确保我的代码的某些特定部分将按照我期望的那样运行,而不会被JIT干扰这个过程。
此外,在创建单元测试时,还有哪些典型的优化情况应该注意?
非常感谢!