gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:39:25 24 4
gpt4 key购买 nike

我有一个基于 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com