我不太了解编译器和 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 不会干扰这个过程。
此外,在创建单元测试时,我应该注意哪些典型的优化案例?
非常感谢!