Java:如果我在类中使用原始数据类型,速度会慢多少? 我正在翻译C++代码,而且有很多使用TyWEFF的方法。我不能 用Java实现这一点,因此我要做的是: // C++ typedef unsigned int BucketKey; // Java public class BucketKey { public int val; }

Java:如果我在类中使用原始数据类型,速度会慢多少? 我正在翻译C++代码,而且有很多使用TyWEFF的方法。我不能 用Java实现这一点,因此我要做的是: // C++ typedef unsigned int BucketKey; // Java public class BucketKey { public int val; },java,c++,porting,Java,C++,Porting,我不是Java专家,实际上是新来的,我想知道有多贵 是否要使用BucketKey,而不是直接使用int 我要说的是,我至少还需要再做5种 谢谢有一些开销装箱和拆箱值。尽管如此,与“典型”程序中的其余处理相比,开销通常可以忽略不计 我建议用最坏的情况(根据密钥访问的数量)用例构建一个测试,如果您认为灵活的密钥类型有一定的价值,那么可以从两个方面来衡量性能 如果您不需要灵活地更改键类型,只需使用int即可。有一些额外的装箱和拆箱值。尽管如此,与“典型”程序中的其余处理相比,开销通常可以忽略不计 我建

我不是Java专家,实际上是新来的,我想知道有多贵 是否要使用BucketKey,而不是直接使用int

我要说的是,我至少还需要再做5种


谢谢

有一些开销装箱和拆箱值。尽管如此,与“典型”程序中的其余处理相比,开销通常可以忽略不计

我建议用最坏的情况(根据密钥访问的数量)用例构建一个测试,如果您认为灵活的密钥类型有一定的价值,那么可以从两个方面来衡量性能


如果您不需要灵活地更改键类型,只需使用int即可。

有一些额外的装箱和拆箱值。尽管如此,与“典型”程序中的其余处理相比,开销通常可以忽略不计

我建议用最坏的情况(根据密钥访问的数量)用例构建一个测试,如果您认为灵活的密钥类型有一定的价值,那么可以从两个方面来衡量性能


如果您不需要灵活地更改密钥类型,只需使用int即可。

这会增加巨大的开销,特别是如果您有数组的话。我建议编写一个测试程序进行比较

在Java中,
int[100]
创建一个包含100个int的数组-类似于C/C++,
Integer[100]
YourObjectContainingAntinMember[100]
有一个包含100个不同对象的100个引用(指针)的数组

更不用说
BucketKey
对象将具有引用语义,但
int
具有与C++中类似的值语义:

BucketKey x = new BucketKey(100);
BucketKey y = x
y.value = 200; // x will change as well

int x = 100;
int y = x;
y = 200; // x will remain 100
<>也值得一提的是,C++中的Type也不创建新的类型。因此,
BucketKey
变量的类型只是int,但Java没有typedef来调用
int
更多方法。不同类型的C++解决方案将是

struct BucketKey {
    value x;
}

这会增加巨大的开销,特别是如果您有阵列的话。我建议编写一个测试程序进行比较

在Java中,
int[100]
创建一个包含100个int的数组-类似于C/C++,
Integer[100]
YourObjectContainingAntinMember[100]
有一个包含100个不同对象的100个引用(指针)的数组

更不用说
BucketKey
对象将具有引用语义,但
int
具有与C++中类似的值语义:

BucketKey x = new BucketKey(100);
BucketKey y = x
y.value = 200; // x will change as well

int x = 100;
int y = x;
y = 200; // x will remain 100
<>也值得一提的是,C++中的Type也不创建新的类型。因此,
BucketKey
变量的类型只是int,但Java没有typedef来调用
int
更多方法。不同类型的C++解决方案将是

struct BucketKey {
    value x;
}

请注意,您的问题与装箱无关:java
int
是一种基本类型,其装箱版本为
java.lang.Integer
。您正在询问对类成员的访问是否比对基元变量的访问慢。大多数Java性能问题基本上没有答案:存在差异,但这种差异取决于许多因素,包括:

  • 硬件架构
  • Java版本
  • 操作系统
但是,除非您正在进行高频交易,否则与生产率的巨大提高相比,如果您在封装方面正确构建程序,性能影响将是完全可以接受的缺点


<>如果你真的有这样的性能问题,你考虑在JVM上工作,你应该寻找比java更现代的编程语言。p> 事实是JVM不支持值类。然而,Scala有:


请注意,您的问题与装箱无关:java
int
是一种基本类型,其装箱版本为
java.lang.Integer
。您正在询问对类成员的访问是否比对基元变量的访问慢。大多数Java性能问题基本上没有答案:存在差异,但这种差异取决于许多因素,包括:

  • 硬件架构
  • Java版本
  • 操作系统
但是,除非您正在进行高频交易,否则与生产率的巨大提高相比,如果您在封装方面正确构建程序,性能影响将是完全可以接受的缺点


<>如果你真的有这样的性能问题,你考虑在JVM上工作,你应该寻找比java更现代的编程语言。p> 事实是JVM不支持值类。然而,Scala有:


如果可能,使用原语int。装箱/拆箱的惩罚不高,但您应该对此进行基准测试以确保。在任何情况下,在您的示例中,看起来都不是在装箱/拆箱。你在做一个基本的对对象的决定

无论如何,你不应该太担心这个问题,除非你正在制作一个实时系统或类似的东西


我同意彼得·劳里的观点。使用VisualVM识别瓶颈。关于这一点,我也写了一个简短的教程。

如果可能的话,使用基本int。装箱/拆箱的惩罚不高,但您应该对此进行基准测试以确保。在任何情况下,在您的示例中,看起来都不是在装箱/拆箱。你在做一个基本的对对象的决定

无论如何,你不应该太担心这个问题,除非你正在制作一个实时系统或类似的东西


我同意彼得·劳里的观点。使用VisualVM识别瓶颈。关于这一点,我也写了一篇简短的教程。

它的不同之处取决于您使用它的程度。如果你每秒使用它一百万次。这不会让你失望的