java - 从 Coldfusion 调用时 jar 中的 BigInteger/SecureRandom 非常慢

标签 java performance coldfusion jar biginteger

我有一个基于 BigInteger 创建随机字符串的类。独立运行时一切正常且高效(Windows,22 毫秒)。

private SecureRandom random = new SecureRandom();

public String testMe() {
     return new BigInteger(130, random).toString(30)
}

当将此代码放入库 (jar) 并从 Coldfusion (9.0.2) 调用时,此代码会挂起 1 到 1.5 分钟(在我的服务器 linux 上)。此代码是从 cfc 调用的:

<cfset myTest = CreateObject("java", "com.acme.MyTest")>

<cffunction name="runTest" access="public">
    <cfset var value = myTest.testMe()/>
</cffunction>

我错过了什么?

最佳答案

I am just astonished that the difference was not noticable on my Windows box.

有不同的 SecureRandom 策略。在 window 上,它可能使用基于主机名的随机种子,对于 windows 来说,它可以漫游到 DNS 以在第一时间进行反向查找。这可能会在一分钟左右后使请求超时。

我会确保您有最新的 Java 更新,因为我相信这是一个已在 Java 6 的某些更新中修复的问题。(与 SecureRandom 无关,但第一个网络操作非常慢)

顺便说一句,这是在 Windows 7 机器上测试的,第一次,它挂了几秒钟,但之后就没有了。


如果您的代码挂起 60 到 90 秒,这不是由于此方法造成的,很可能您正在执行 GC,而此方法正在停止是因为它分配了内存。


虽然 BigInteger 很慢,但 SecureRandom 慢得多。如果你想让它更快,请使用普通的 Random。

如果你使用更少的位,它会稍微快一些。

顺便说一句,我会使用基数 36(最大值),而不是基数 30。

static volatile String dontOptimiseAway = null;
public static void testRandomBigInteger(Random random) {
    long start = System.nanoTime();
    int runs = 10000;
    for(int i=0;i< runs;i++) {
        dontOptimiseAway = new BigInteger(130, random).toString(36);
    }
    long time = System.nanoTime() - start;
    System.out.printf("%s took %.1f micro-seconds on average%n", random.getClass().getSimpleName(), time/runs/1e3);
}
public static void main(String... ignored) {
    for (int i = 0; i < 10; i++) {
        testRandomBigInteger(new Random());
        testRandomBigInteger(new SecureRandom());
    }
}

打印

Random took 1.7 micro-seconds on average
SecureRandom took 2.1 micro-seconds on average

生成字符串的时间很长,但还不足以导致数秒的延迟。

关于java - 从 Coldfusion 调用时 jar 中的 BigInteger/SecureRandom 非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18193276/

相关文章:

c - 将 const 指针传递给结构 vs 按值传递

java - 我应该 `new` 循环内部还是外部的对象?

java 构造函数(int) 未定义,但我确实有

java - 如何在 REACT 的表单字段中获取正确的日期时间?

Java序列化,ObjectInputStream.readObject(),检查是否会阻塞

sql - 测试 MySQL 表中是否存在一行的最佳方法

iis - ColdFusion 10 开发人员和 Windows 7 (IIS 7.5)

image - 使用 Coldfusion 8 将图像添加到 Excel 文档中的行

email - 使用 CFMAIL 发送时显示完整的 "from"名称

Java删除包含换行符的字符串