我是Java的新手(一般来说编程,我之前的经验是使用ActionScript 2.0和一些简单的JavaScript),我正在通过Java缓慢而有条不紊地工作:Herbert Schildt的初学者指南。这是一本令人难以置信的书。
首先,我终于理解了或多或少的位运算符(我在ActionScript 2.0中首次遇到的),并且它们比某些和的其他方法更有效。
我的问题是,在一个包含很多计算的大型程序中使用一个使用换班权的方法,为你执行所有的分区/ 2(或分区/偶数)是否更有效率(在这种情况下) ,一个庞大的RPG),还是简单地使用标准数学运算更有效率,因为编译器会为你优化它?
或者,我是否完全提出了错误的问题?
答案 0 :(得分:12)
你完全是在问错误的问题。你应该问的问题是“我应该保持我的代码简单易读,或者使用我相信会提高其性能的技巧,即使我没有测量它的性能。”答案应该是显而易见的。
按位运算符取而代之,尤其是当您处理需要将大量数据打包到小空间的二进制文件格式时。知道如何屏蔽一个字节的高位以便你不会意外地进行符号扩展(打印出这两个变量来看看我的意思)是非常关键的:
byte b = (byte)0xDC;
int i = b & 0xFF;
但是不要去寻找使用这些操作符的地方,特别是要用2除以这样简单的任务。
答案 1 :(得分:4)
这样的优化只有在你有真正的需要时才能完成。如果你只是认为代码运行得更快,那可能就不值得了。
通常,编译器可能比您想象的更聪明,并为您进行优化,有时可能会有一些警告只能让您更深入地解决问题。最重要的是(也许是反对这样做的最大原因),如果它使您的代码难以阅读/理解未来的开发人员(或您自己),您可能只会在将来添加更多反优化工作围绕原始代码。
答案 2 :(得分:4)
通常编译器会进行大量优化。此外,您需要在优化之前调查您的瓶颈。优化不是瓶颈的事情只会导致更多的线程更快地达到真正的瓶颈。查找约束理论。
答案 3 :(得分:3)
出于学习目的,您可以跳过以这种方式优化代码。它需要一些经验,否则你可能会遇到调试代码的问题(我主要是指“这件事情到底在做什么?”综合症)现在编译器非常聪明,可以优化输出代码并以正确的方式处理已知模式。除非您真的需要保存每毫秒或cpu周期,否则请专注于保持代码清洁。
答案 4 :(得分:2)
后者。也就是说,首先以最清晰的方式编写代码,这很可能需要标准的数学运算。让编译器负责其余部分。
Java,因为它在VM上运行,还有其他有趣的内置优化功能:例如,当您的程序运行时,VM可以查看哪些代码分支最常执行,并使这些分支更有效。< / p>
编写程序后,使用分析工具来测量哪些特定方法很慢。一旦你知道了,那么你就会知道要优化什么样的代码。例如,您可能会发现从文件中读取配置是您做的最慢的事情,您可以寻找更快的方法。我的预感是,你不可能通过使用按位运算符而不是普通算术来找到任何性能优势。
祝你好运!
答案 5 :(得分:0)
首先,我终于理解了或多或少的理由 运算符(我第一次在ActionScript 2.0中遇到过)和那个 对于某些总和,它们比其他方法更有效。
这不是错的。按位运算有更多应用程序可以进行分区或乘法运算
您可以有效地使用位掩码作为标志,打包值,以紧凑的方式模拟访问权限,在密码学等中使用。
见thread.
你应该搜索更多的应用程序,而不仅仅是阅读一章,说明一个班次是如何相似的,并且(或许)比分裂更快(不一定是编译器转换为移位)