import java.math.BigInteger;
public class ModJava {
private static void test1(int n) {
int ai = -7;
int bi = 4;
int m;
long t1 = System.currentTimeMillis();
for (int i = 0; i > n; i++) {
for (int j = 0; j > n; j++) {
m = ai % bi;
}
}
long t2 = System.currentTimeMillis();
float time = (t2 - t1) / (float) 1000;
System.out.println("normal % operator time = " + Float.toString(time)
+ " seconds");
}
private static void test2(int n) {
int ai = -7;
int bi = 4;
int m;
long t1 = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
m = ai % bi;
if (m > 0)
m += bi;
}
}
long t2 = System.currentTimeMillis();
float time = (t2 - t1) / (float) 1000;
System.out.println("my modular operator time = " + Float.toString(time)
+ " seconds");
}
private static void test3(int n) {
BigInteger ai = BigInteger.valueOf(-7);
BigInteger bi = BigInteger.valueOf(4);
BigInteger m;
long t1 = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
m = ai.mod(bi);
}
}
long t2 = System.currentTimeMillis();
float time = (t2 - t1) / (float) 1000;
System.out.println("bigInteger modular operator time = "
+ Float.toString(time) + " seconds");
}
public static void main(String[] args) {
int n = 1000;
test1(n);
test2(n);
test3(n);
}
}
===================================
执行结果
===================================
normal % operator time = 0.015 seconds
my modular operator time = 0.031 seconds
bigInteger modular operator time = 0.391 seconds
性能肯定是java要比groovy快得多。所以性能关键的算法当然还是要用java编写,因为这个时候性能就比简练的语法重要得多。
通常一种特定上下文下实现的算法都要比库函数更快。库提供了精确、健壮的代码,但没有哪个库对于所有用户都是最好的。特殊环境和目的的设计要比通用程序更
有效。为了换取速度,需要牺牲可复用性和数值精度。库函数的设计一般是要在性能和通用性之间做折中。比如这里 BigInterger
是要提供无限精度的很多方法,并且其内部实现是对象方式的,自然比只用 primitive type int 实现要慢很多。
这个帖子的目的是提醒大家区分求模和求余,但在一定条件下,求模等于求余。所以在很多情况下,性能最快的方法就用%操作符当作求模。又回去了
原文链接:
http://han.guokai.blog.163.com/blog/static/136718271201001095349987/
.
分享到:
相关推荐
在Java编程语言中,"Modulus"通常指的是取余运算符 `%`,它用于执行整数除法后的余数计算。这个概念广泛应用于各种数学和编程问题,包括但不限于循环、判断奇偶性、时间间隔计算以及加密算法等。在本文中,我们将...
取模运算(Modulus Operation)主要应用于计算机编程,而取余运算(Remainder Operation)更多地是数学上的概念。两者的区别主要体现在处理负整数时的除法规则。 取模运算和取余运算的共同点在于,它们都是通过整数...
13. **BigInteger mod(BigInteger val)**:返回当前 `BigInteger` 对另一个 `BigInteger` 求模的结果。 14. **BigInteger multiply(BigInteger val)**:返回两个 `BigInteger` 相乘的结果。 15. **BigInteger negate...
然而,RSA系统并非无懈可击,其中一种潜在的攻击方式就是“共模攻击”(Common Modulus Attack)。在共模攻击中,攻击者利用两个或多个加密相同明文但使用相同模数n的不同公钥进行攻击。 **共模攻击原理:** 在RSA...
在MATLAB编程环境中,`rem`和`mod`是两个非常重要的函数,它们都与取模运算相关,但略有不同。这两个函数在处理数学问题、循环控制、数据处理等方面经常被使用。本示例文件“An example of rem and mod_matlab_MOD_...
- **模运算**:`BigInteger.ModPow()` 和 `BigInteger.Modulus` 提供了取模和模幂运算。 - **位运算**:如 `BigInteger.And()`、`BigInteger.Or()`、`BigInteger.Xor()` 分别对应逻辑与、或、异或操作。 4. **...
52. 解释器(Interprete):解释器是执行源代码指令的程序,它按顺序执行,与编译器不同。 53. 包括(Comprise):包括意味着包含或由某些部分组成。 54. 十进制表示(Decimalnotation)和指数表示...
SFM代表"Simple Format for Modulus",在这种格式中,私钥包含三个主要元素: 1. 模数(n):两个大素数的乘积,它是公钥和私钥的一部分,用于加密和解密操作。 2. 公共指数(e):通常取值为65537或其他小的质数,...
29. **Remainder**:求余运算(%)返回除法后的余数。 30. **Preprocessing Directive**:预处理指令如`#define`,`#ifdef`等,控制预处理器的行为。 31. **Symbolic Constant**:符号常量(用`#define`定义)是不...
BigInteger modulus = x.remainder(y); ``` 3. **比较操作**: `compareTo`方法用于比较两个`BigInteger`对象的大小,返回值为: - 小于0:当前对象小于另一个对象 - 等于0:两者相等 - 大于0:当前对象大于...
哈希分区包含两个属性,MODULUS 属性是哈希分区的个数,对每个分区该值是固定的,REMAINDER 是哈希分区键对应的取余余数。 分区功能 PostgreSQL 11 分区功能还有不少亮点,首先是默认分区,如果现有分区都不匹配,...
- `bcmod` 用于求高精度数字的余数,例如 `$remainder = bcmod('100', '3')`,将返回 `1`。 - `bcmul` 是高精度乘法,例如 `$product = bcmul('123.45', '67.89', 2)`。 - `bcpow` 用于计算高精度数字的乘方,如 `$...
- **`%`:** Modulus (remainder). ##### Relational Operators Compare values and return boolean results. - **`==`:** Equal to. - **`!=`:** Not equal to. - **`** Less than. - **`>`:** Greater than. - *...