在Java中从int转换为short是多么昂贵

时间:2011-05-12 19:34:49

标签: java casting int micro-optimization

就运行时性能而言,在Java中将int转换为short是多么昂贵?可能有成千上万的这样的铸造,因此我想知道它是否会影响性能。感谢。

7 个答案:

答案 0 :(得分:6)

没有。它不会影响表演。这是一个简单的操作。 当您想要分析软件的性能时,您最好根据输入的大小关注算法运算的计算成本。

答案 1 :(得分:3)

您可以忽略该演员的费用。你不会注意到成千上万的演员。

答案 2 :(得分:3)

将抛弃的辩论和借口放在一边......

首先,short是一种特殊的数据类型。 Java并不喜欢short Java实际上非常喜欢int,因为 JVM堆栈使用32位寄存器short是一个16位数据类型(int = 32位)。

由于32位结构,每当java向堆栈移动一个short时,它就会自动转换为整数。所以,首先想知道的是,我想在java中使用short吗?他们确实付出了代价。这就是为什么你很少会在jdk源代码中看到任何short数据类型用法。

将整数转换为short时,JVM使用 i2s操作具体费用取决于您使用的JVM和硬件。

您可以找到一些统计信息in this paper,但遗憾的是,i2s未列出。它应该不到20ns。

答案 3 :(得分:1)

我认为安全的做法是在遇到性能问题之前不要担心性能问题。当您确实遇到性能问题时,很可能在大多数业务应用程序中,大多数应用程序的迟缓都可以在与磁盘和/或网络的交互中得到解决。我认为像这样的微优化不太可能对你的表现产生很大的影响。

答案 4 :(得分:1)

你为什么需要这样做?我认为它不会对性能产生太大影响,但请记住您需要的数据类型范围:

int:   -2,147,483,648 to 2,147,483,647
short: -32,768 to 32,767

答案 5 :(得分:1)

以下是长期测试,但可以很容易地适应短期。 将int转换为long在这个示例中比仅传入long长约5%。

有趣的是,使用隐式强制转换调用该方法的速度较慢,谢谢你自己动手。

没有演员:PT0.141517096S    随着演员阵容:PT0.148024511S    隐式演员:PT0.159904349S

@Test
public void testPerformance(){
    long sum =0L;
    long timeCallWithImplicitCast =0;
    long timeCallWithLong =0;
    long timeCallWithCast =0;


    for(int j=0;j<2;j++) {//First run warm-up
        timeCallWithCast=0;
        timeCallWithLong=0;
        timeCallWithImplicitCast=0;
        for (int i = 0; i < 10_000_000; i++) {
            long s1 = System.nanoTime();
            sum += shift(i);//Call with int implicit cast
            long e1 = System.nanoTime();
            timeCallWithImplicitCast += (e1 - s1);
        }
        for (int i = 0; i < 10_000_000; i++) {
            long s3 = System.nanoTime();
            sum += shift((long) i);//Call with cast long
            long e3 = System.nanoTime();
            timeCallWithCast += (e3 - s3);
        }
        for (int i = 0; i < 10_000_000; i++) {
            long l = (long) i;
            long s2 = System.nanoTime();
            sum += shift(l);//Call with long
            long e2 = System.nanoTime();
            timeCallWithLong += (e2 - s2);
        }
    }
    System.out.println("With no cast      : "+ Duration.ofNanos(timeCallWithLong));
    System.out.println("With cast         : "+Duration.ofNanos(timeCallWithCast));
    System.out.println("With implicit cast: "+Duration.ofNanos(timeCallWithImplicitCast));

}

protected long shift(long index){
    return index << 4;
}

答案 6 :(得分:0)

与从内存加载int或存储短片相比,演员阵容很小。在任何情况下,它们都花费大约2纳秒。如果你做了数以千计的这些将花费几微秒。