草庐IT

java - 成员顺序是否会像在 C 或 C++ 中那样在 Java 中产生性能差异?

coder 2024-03-17 原文

在 C 和 C++ 中,不允许编译器对结构的数据成员重新排序,因此如果您不小心对它们进行排序,最终会浪费空间。例如:

struct S {
    int i;
    void *p;
    int i2;
};

在具有 32 位 int 和 64 位指针的平台上,i 将放在第一位,然后是 32 位填充,以便 p 可以是 64 位对齐的。 i2 然后占据下一个单词的一半,然后是另外 32 位的填充。生成的结构有 24 个字节长,而如果先声明 p,它只有 16 个字节长。如果数组中有很多这样的结构,查找和删除填充有时可能是一项重要的优化,以节省内存并减少缓存流失。

我很想知道 Java 是否具有相同的功能。未装箱的类型(例如 intboolean)是否与引用大小相同或更小?如果它们更小,是否允许编译器对它们重新排序以避免插入填充以对齐后续字段?最后,如果是,有编译器这样做吗?

我现在对此没有特别的优化需求,我只是想知道在选择声明我的字段的顺序时是否应该牢记这一点,就像我在 C 中所做的那样。

最佳答案

int 类型始终为 32 位,引用通常为 32 位,即使在 64 位 JVM 中也是如此。

在不利方面,Java 在每个对象的开头有一个 8-12 字节的 header ,并使用 8 字节对齐。顺便说一句,一些 C++ 环境有 16 字节对齐。

Are unboxed types (such as int and boolean) the same size as references or smaller?

对于 boolean、byte、char 和 short,您可以期望它们更小,但对于 long 和 double,原语可以比引用更大。

And if they're smaller, is the compiler allowed to reorder them to avoid inserting padding to align subsequent fields?

JIT 可以重新组织字段,甚至优化它们。

Finally, if it is, do any compilers do this?

javac 编译几乎没有进行任何优化,查看字节码会给您一些关于运行时会发生什么的线索。 JIT 可以选择任何方式优化对象中的字段。

I'm just curious to know if I should bear this in mind when choosing what order to declare my fields, like I do in C.

恕我直言,您可以假设您可能在 C 中使用的几乎所有优化技巧都不再适用于 Java。在为数不多的情况下,它们可能并不完全相同。

您应该假定 JIT 将根据需要优化代码,并使用分析器来确定您是否以及何时遇到问题。然后才考虑出于性能原因更改代码。

关于java - 成员顺序是否会像在 C 或 C++ 中那样在 Java 中产生性能差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12894298/

有关java - 成员顺序是否会像在 C 或 C++ 中那样在 Java 中产生性能差异?的更多相关文章

  1. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  4. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  5. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  6. ruby - 在匿名 block 中产生 - 2

    我没有理解以下行为(另请参阅inthisSOthread):defdef_testputs'def_test.in'yieldifblock_given?puts'def_test.out'enddef_testdoputs'def_testok'endblock_test=procdo|&block|puts'block_test.in'block.callifblockputs'block_test.out'endblock_test.calldoputs'block_test'endproc_test=procdoputs'proc_test.in'yieldifblock_gi

  7. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  8. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  9. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  10. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

随机推荐