安装数组的所有值的最快方法?
我有
, 并且我想在相同的值下设置每个索引的值。
.
有一种明显的方法可以做到 /迭代/:
但我想知道是否有一种我可以使用的方法
或者等同的东西,这将花费迭代的需要。 有没有办法做到这一点?
EDIT :
经过
这完全是相同的过程,表明它可能不是最好的方法。
+1 建议的每个人
反正 - 你完全正确,谢谢。
char []
, 并且我想在相同的值下设置每个索引的值。
char
.
有一种明显的方法可以做到 /迭代/:
char f = '+';
char [] c = new char [50];
for/int i = 0; i < c.length; i++/{
c[i] = f;
}
但我想知道是否有一种我可以使用的方法
System.arraycopy
或者等同的东西,这将花费迭代的需要。 有没有办法做到这一点?
EDIT :
经过
Arrays.java
public static void fill/char[] a, int fromIndex, int toIndex, char val/ {
rangeCheck/a.length, fromIndex, toIndex/;
for /int i = fromIndex; i < toIndex; i++/
a[i] = val;
}
这完全是相同的过程,表明它可能不是最好的方法。
+1 建议的每个人
fill
反正 - 你完全正确,谢谢。
没有找到相关结果
已邀请:
14 个回复
石油百科
赞同来自:
:
http://docs.oracle.com/javase/ ... %255D,%20char%29
帅驴
赞同来自:
http://docs.oracle.com/javase/ ... .html
, 哪一个 /如果一个 JVM, 您使用足够的智能/ 可以转换为运行
https://coderoad.ru/7367677/
:-
这项决定是由 IBM 研究
https://ieeexplore.ieee.org/document/5387064
.
简化解释
从评论中如下,它设置了索引 0 您的值中的目标数组,然后使用
http://docs.oracle.com/javase/ ... .html
复制一个对象的类,即索引的对象 0 在索引中 1, 然后是这两个对象 /指数 0 和 1/ 在 2 和 3, 然后这四个物体 /0,1,2 和 3/ 在 4,5,6 和 7 等等...
效率 /当时
文章/
在快速里程,抓住
之前和之后并计算出我发明的持续时间: -
这种方法 :
332,617 - 390,262
/'highest - lowest' 的 10 测试/
: 666,650
通过循环设置。 :
3,743,488
-
9,767,744
/'highest - lowest' 的 10 测试/
: 12,539,336
汇编 JVM 和 JIT
应该指出的是,随着发展 JVM 和 JIT 这种方法可能很过时,因为图书馆的优化和执行时间可以实现甚至超过这些数字,只需使用
.
在撰写文章时,它是我找到的最快选择。 已经提到了现在它可能不是这样的,但我没有检查过。 在这个美丽和诅咒 Java.
石油百科
赞同来自:
窦买办
赞同来自:
优惠:
它基本上是这样做的 log2 /array.length/ 挑战 System.arraycopy, 我们希望哪种方式使用优化的实施 memcpy.
但是,是否仍然需要现代技术 Java JITs, 如 Oracle/Android JIT?
帅驴
赞同来自:
12:33:18
2循环阵列占据 133536 纳米秒。
System.arraycopy 循环占用 22070 纳米秒。
一轮 Arrays.fill 占据 9777 纳米秒。
两轮 Arrays.fill 占据 93028 纳米秒。
12:33:38
2循环阵列占据 133816 纳米秒。
System.arraycopy 循环占用 22070 纳米秒。
一轮 Arrays.fill 占据 17042 纳米秒。
两轮 Arrays.fill 占据 95263 纳米秒。
12:33:51
2循环阵列占据 199187 纳米秒。
System.arraycopy 循环占用 44140 纳米秒。
一轮 Arrays.fill 占据 19555 纳米秒。
两轮 Arrays.fill 占据 449219 纳米秒。
12:34:16
2循环阵列占据 199467 纳米秒。
System.arraycopy 循环占用 42464 纳米秒。
一轮 Arrays.fill 占据 17600 纳米秒。
两轮 Arrays.fill 占据 170971 纳米秒。
12:34:26
2循环阵列占据 198907 纳米秒。
System.arraycopy 循环占用 24584 纳米秒。
一轮 Arrays.fill 占据 10616 纳米秒。
两轮 Arrays.fill 占据 94426 纳米秒。
二哥
赞同来自:
char[] b
, 而且你想更换
在
, 您可以使用
.
喜特乐
赞同来自:
https://docs.oracle.com/javase ... .html
方法 setAll, 由提供以计算每个元素的生成函数设置指定数组的所有元素。
这四个过载
三
其中,他们采取了一系列原语,如下所示:
https://docs.oracle.com/javase ... tion-
IntToDoubleFunction/
https://docs.oracle.com/javase ... ator-
IntUnaryOperator/
https://docs.oracle.com/javase ... tion-
IntToLongFunction/
如何使用上述方法的示例:
该方法提供的功能
, 获取元素索引并返回此索引的值。
您是否有兴趣涉及字符数组?
这是第四重新加载方法进入游戏
. 由于没有过载,消耗了一系列符号基元,因此我们拥有的唯一选择, - 这将更改我们符号数组的广告
Character[]
.
如果阵列类型的变化
不合适,然后你可以返回方法 Arrays.fill.
使用方法的示例
从
Character[]
:
虽然是
设置定义
值更容易使用该方法
, 不是方法
.
方法
您可以使用相同值的数组的所有元素,或生成偶数数组,奇数或任何其他公式的所有优点
例如。
还有几种方法过载。 parallelSetAll, 并行执行,尽管重要的是要注意该方法传输的功能 parallelSetAll,
必须摆脱副作用
.
输出
如果你的目标是
设置定义
数组的每个元素的值,然后使用过载
这将是最合适的选择。 但是,如果您希望按需更灵活或生成元素,最好使用
或者
/当它是合适的/.
小姐请别说爱
赞同来自:
http://docs.oracle.com/javase/ ... .html
方法 Arrays.fill:
郭文康
赞同来自:
可以满足您的需求
江南孤鹜
赞同来自:
http://docs.oracle.com/javase/ ... %255D,%20char%29
虽然它可能在背景中产生一个循环,但因此没有比你所拥有的更有效 /除了保存日志线/. 如果您真正照顾效率,请尝试以下与上述内容相比:
这是怎么做的 Arrays.fill.
/我想你可以调查 JNI 和使用
./
</div>
<div class="answer_text">
回答罗斯画作略有改善。
为了
小的
Massif简单周期比方法更快 System.arraycopy, 由于与设置相关的开销成本 System.arraycopy. 因此,最好使用简单的循环填充阵列的前几个字节并转到 System.arraycopy 只有在完成的阵列具有一定尺寸时才。
初始循环的最佳大小将是 JVM 具体而且,当然,专门用于系统。
</div>
<div class="answer_text">
您可以使用
, 但这取决于您是否可以提前定义原始数组, - 您是否需要每次填充不同的字符,或者您是否使用相同的符号填写阵列?
显然,填充长度很重要 - 或者您需要一个超过所有可能的目的地的来源,或者您需要多个循环 arraycopy 数据片段直到目的地已满。
</div>
<div class="answer_text">
arrays.fill是通用目的的最佳选择。
如果您需要填充大型数组,虽然是最后一个版本 idk 1.8 u102, 使用更快的方式 System.arraycopy.
您可以查看此替代实施。 Arrays.fill:
根据
https://github.com/zolyfarkas/ ... .java
JMH, 你几乎可以 2x 表现 boost 对于大型盾牌 /1000 +/
在任何情况下,都应仅在必要的地方使用这些实现。 JDKs Arrays.fill 必须是一个首选。
</div>
</size;>
涵秋
赞同来自:
这是怎么做的 Arrays.fill.
/我想你可以调查 JNI 和使用
./
奔跑吧少年
赞同来自:
为了
小的
Massif简单周期比方法更快 System.arraycopy, 由于与设置相关的开销成本 System.arraycopy. 因此,最好使用简单的循环填充阵列的前几个字节并转到 System.arraycopy 只有在完成的阵列具有一定尺寸时才。
初始循环的最佳大小将是 JVM 具体而且,当然,专门用于系统。
窦买办
赞同来自:
, 但这取决于您是否可以提前定义原始数组, - 您是否需要每次填充不同的字符,或者您是否使用相同的符号填写阵列?
显然,填充长度很重要 - 或者您需要一个超过所有可能的目的地的来源,或者您需要多个循环 arraycopy 数据片段直到目的地已满。
帅驴
赞同来自:
如果您需要填充大型数组,虽然是最后一个版本 idk 1.8 u102, 使用更快的方式 System.arraycopy.
您可以查看此替代实施。 Arrays.fill:
根据
https://github.com/zolyfarkas/ ... .java
JMH, 你几乎可以 2x 表现 boost 对于大型盾牌 /1000 +/
在任何情况下,都应仅在必要的地方使用这些实现。 JDKs Arrays.fill 必须是一个首选。