【发布时间】:2014-12-01 23:07:25
【问题描述】:
我正在研究一种算法,该算法需要尽可能快地生成数百万个数字。实际上我发现我的算法的 rand() 函数占用了 75% 的处理时间。
所以我正在寻找更快的东西。而且我根本不需要很大的范围。 (我只需要1000以下的整数)
你知道我可以用什么吗?
谢谢!
编辑:
我使用这个数字来洗牌少于 1000 个实体的组。
我发现了更多关于“快速兰特”的信息。还有 SSE 版本,速度更快,一次生成 4 个数字。
【问题讨论】:
-
3 秒的 75% 不算多。通常,
rand()非常快。您的代码需要多长时间才能创建 100 万个数字? -
不要将 75% 视为“慢”。毕竟,即使它在一纳秒内运行,something 也会占用 100% 的时间。如果程序除了生成随机数之外什么都不做,你会认为这会占用大部分时间。但是,如果您希望它更快,它确实会告诉您在哪里查看。
-
我并不是说它“慢”,但如果我想改进我的算法,这可能是我应该开始的地方。
-
我总是要问 - 你是从
gprof那里得到的吗?如果是这样,请不要相信,因为gprof会忽略 I/O 之类的阻塞时间,以及在非 pg 编译库中花费的任何时间。如果你在某处写下这些数字,那很可能是真正的耗时的。 I use this method. -
你的“随机”数字需要有多“随机”?如果您在基于 Linux/glibc 的系统上,您的问题是
rand实际上是根据random实现的,这是一个相当高质量(因此很慢)的 PRNG。像纯 LCG 这样的低质量的应该快得多,但可能有足够糟糕的统计属性,使它们不适合您的应用程序。