我正在研究一些需要高度优化的Java代码,因为它将在我的主程序逻辑中的许多点调用的热函数中运行.此代码的一部分涉及将double变量乘以10凸起到任意非负int exponents.一个快速的方式(编辑:但不是最快的,见下面的更新2)获得相乘的值是switch在exponent:
double multiplyByPowerOfTen(final double d, final int exponent) {
switch (exponent) {
case 0:
return d;
case 1:
return d*10;
case 2:
return d*100;
// ... same pattern
case 9:
return d*1000000000;
case 10:
return d*10000000000L;
// ... same pattern with long literals
case 18:
return d*1000000000000000000L;
default:
throw new ParseException("Unhandled power of ten " + power, 0);
}
}
Run Code Online (Sandbox Code Playgroud)
上面注释的省略号表示case int常量继续递增1,因此case上面的代码片段中确实有19 秒.因为我不知道我是否真的需要10一切权力,并case声明 …
java compiler-construction performance assembly switch-statement
是一种switch说法实际上比更快的if声明?
我使用/Ox标志在Visual Studio 2010的x64 C++编译器上运行下面的代码:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define MAX_COUNT (1 << 29)
size_t counter = 0;
size_t testSwitch()
{
clock_t start = clock();
size_t i;
for (i = 0; i < MAX_COUNT; i++)
{
switch (counter % 4 + 1)
{
case 1: counter += 4; break;
case 2: counter += 3; break;
case 3: counter += 2; break;
case 4: counter += 1; break;
}
}
return …Run Code Online (Sandbox Code Playgroud) 在Java类中,可以定义一个方法final,以标记此方法可能不会被覆盖:
public class Thingy {
public Thingy() { ... }
public int operationA() {...}
/** this method does @return That and is final. */
public final int getThat() { ...}
}
Run Code Online (Sandbox Code Playgroud)
这很清楚,它可能有助于防止意外覆盖,或者表现 - 但这不是我的问题.
我的问题是:从OOP的角度来看,我理解通过定义一个方法final,类设计者承诺这个方法将始终如所描述或隐含的那样工作.但是,这通常可能超出了班级作者的影响,如果该方法所做的事情比传递财产更复杂.
句法约束对我来说很清楚,但OOP意义上的含义是什么?final大多数班级作者在这个意义上是否正确使用?
final方法承诺什么样的"合同" ?
可能重复:
确定整数的平方根是否为整数的最快方法
有什么方法可以看出一个数字是否是一个完美的正方形?
bool IsPerfectSquare(long input)
{
// TODO
}
Run Code Online (Sandbox Code Playgroud)
我正在使用C#,但这与语言无关.
奖励点是为了清晰和简洁(这不是代码高尔夫).
编辑:这比我想象的要复杂得多!事实证明,双精度问题有两种表现形式.首先,Math.Sqrt采用了一个不能精确控制的长度(感谢Jon).
其次,当你拥有一个巨大的,接近完美的正方形时,双精度将失去小值(.000 ... 00001).例如,我的实现未通过Math.Pow(10,18)+1的测试(我的报告为真).
我知道如何制作Fibonacci数列表,但我不知道如何测试给定数字是否属于斐波纳契列表 - 记住的一种方法是生成fib列表.数字达到那个数字并查看它是否属于数组,但必须有另一种更简单,更快速的方法.
有任何想法吗 ?
我们知道如果n不是一个完美的正方形,那么sqrt(n)就不会是一个整数.由于我只需要整数部分,我觉得调用sqrt(n)不会那么快,因为计算小数部分也需要时间.
所以我的问题是,
我们是否只能获得sqrt(n)的整数部分而不计算实际值sqrt(n)?算法应该比sqrt(n)(在<math.h>或中定义<cmath>)更快?
如果可能,您也可以在asm块中编写代码.
我正在寻找一个快速,仅整数算法来找到无符号整数的平方根(整数部分).代码必须在ARM Thumb 2处理器上具有出色的性能.它可以是汇编语言或C代码.
任何提示欢迎.
鉴于两个整数a和b,有没有检验是否有另一个整数的有效方式n,使得?a ? n2 < b
我不需要知道n,只知道是否n存在至少一个这样的存在,所以我希望避免计算区间中任何数字的平方根.
虽然测试单个整数是否是完美的正方形比计算平方根更快,但是范围可能很大,我也希望避免对该范围内的每个数字执行此测试.
例子:
intervalContainsSquare(2, 3) =>假intervalContainsSquare(5, 9) => false(注意:9超出此间隔)intervalContainsSquare(9, 9) => false(此间隔为空)intervalContainsSquare(4, 9) => true(4在此区间内)intervalContainsSquare(5, 16) => true(9在此区间内)intervalContainsSquare(1, 10) => true(1,4和9都在此区间内)可能重复:
确定输入是否是完美正方形的好算法是什么?
我希望用最短最简单的方法来检查数字是否是C#中的完美平方
一些完美的正方形:
1, 4, 9, 16, 25, 36, 49, 64, 81, 100, ......
Run Code Online (Sandbox Code Playgroud)