6

我对 Java 非常陌生(一般来说,我以前的经验是使用 ActionScript 2.0 和一些简单的 JavaScript),我正在慢慢地、有条不紊地学习 Java:Herbert Schildt 的初学者指南。这是一本不可思议的书。

一方面,我终于或多或少地了解了位运算符(我在 ActionScript 2.0 中第一次遇到)的作用,并且对于某些总和,它们比其他方法更有效。

我的问题是,在一个有很多计算的大型程序中(在这种情况下,一个庞大的RPG),还是简单地使用标准数学运算更有效,因为编译器会为您优化它?

或者,我是否完全问错了问题?

4

6 回答 6

15

您完全是在问错误的问题。你应该问的问题是“我应该保持我的代码简单易读,还是使用我认为可以提高其性能的技巧,即使我没有测量它的性能。” 答案应该是显而易见的。

位运算符有它们的位置,尤其是当您处理需要将大量数据打包到小空间中的二进制文件格式时。知道如何屏蔽字节的高位是绝对关键的,这样你就不会意外地进行符号扩展(打印出这两个变量以了解我的意思):

byte b = (byte)0xDC;
int  i = b & 0xFF;

但是不要去寻找使用这些运算符的地方,尤其是替换除以 2 之类的简单任务。

于 2012-08-28T21:38:38.037 回答
4

像这样的优化只有在你有真正需要的情况下才应该做。如果您只是认为代码会运行得更快,那可能不值得。

很多时候编译器可能比你想象的更聪明,并且会为你做优化,其他时候可能会有一些警告,只会让你陷入更深的麻烦。最重要的是(可能是反对这样做的最大原因),如果它使您的代码难以被未来的开发人员(或您自己)阅读/理解,那么您可能只会在将来尝试工作时添加更多的反优化围绕原始代码。

于 2012-08-28T21:37:28.603 回答
4

通常编译器会做很多优化。此外,您还需要在优化它之前调查您的瓶颈到底是什么。优化不是瓶颈的东西只会导致更多线程更快地达到真正的瓶颈。查找约束理论。

于 2012-08-28T21:38:01.770 回答
3

出于学习目的,您可以跳过这种方式优化您的代码。它需要一些经验,否则您可能会在调试代码时遇到问题(我的主要意思是“这东西到底在做什么?”综合症)现在的编译器足够聪明,可以优化输出代码并以正确的方式处理已知模式。除非您真的需要节省每个毫秒或 cpu 周期,否则请专注于保持代码清洁。

于 2012-08-28T21:37:58.630 回答
2

后者。也就是说,首先以最清晰的方式编写代码,这很可能需要标准的数学运算。让编译器处理剩下的事情。

Java,因为它运行在虚拟机上,所以有其他有趣的内置优化特性:例如,当你的程序运行时,虚拟机可以看到哪些代码分支被最频繁地执行,并使这些分支更有效率。

编写程序后,请使用分析工具来衡量哪些特定方法较慢。一旦你知道了这一点,那么你就会知道要优化什么样的代码。例如,您可能会发现从文件中读取配置是您做的最慢的事情,您可以寻找方法来加快速度。我的直觉是,通过使用位运算符而不是普通算术,您根本不可能发现任何性能优势。

祝你好运!

于 2012-08-28T21:37:58.537 回答
0

一方面,我终于或多或少地了解了位运算符(我在 ActionScript 2.0 中第一次遇到)的作用,并且对于某些总和,它们比其他方法更有效。

不,这是错误的。位运算有更多的应用程序来执行您询问的除法或乘法。
您可以有效地将位掩码用作标志、打包值、以紧凑的方式模拟访问权限、在密码学等中。
请参阅此线程。 您应该搜索更多的应用程序,而不仅仅是阅读关于移位如何相似并且(可能)比除法更快的章节(不一定因为编译器无论如何都会转换为移位)

于 2012-08-28T21:43:02.540 回答