小编Isa*_*kum的帖子

将 int[] 转换为 Integer[] 哪种方法最快?

int[]我正在尝试将长度为 1,000,000 的非常长的值转换为Integer[],以便我可以使用自定义比较器对其进行排序(它根据定义的相应列表的长度对元素进行排序Map<Integer, List<Integer>>)。

我做了以下事情:

private static Integer[] convert(int[] arr) {
        Integer[] ans = new Integer[arr.length];
        for (int i = 0; i < arr.length; i++) {
            ans[i] = arr[i];
        }
        return ans;
    }
Run Code Online (Sandbox Code Playgroud)

它对我来说效果很好,但我也遇到过

Integer[] ans = Arrays.stream(intArray).boxed().toArray( Integer[]::new );
Run Code Online (Sandbox Code Playgroud)

Integer[] ans = IntStream.of(intArray).boxed().toArray( Integer[]::new );
Run Code Online (Sandbox Code Playgroud)

其中是否有任何一个比其他的要快得多?或者是否有其他足够快的方法来缩短运行时间?

java arrays performance

2
推荐指数
1
解决办法
143
查看次数

在发布模式下,从不可变上下文进行不安全的变异会失败

在下面的代码中,我使用不安全代码将不可变引用转换为可变指针,然后尝试通过该可变指针编辑内部值。

fn main() {
    #[repr(transparent)]
    struct Item(isize);

    impl Item {
        #[inline]
        fn ptr(&self) -> *mut isize {
            self as *const Item as *mut isize
        }
        fn increment(&self) {
            let val = self.0 + 1;
            unsafe {std::ptr::write(self.ptr(), val)}
        }
    }

    let item = Item(22);
    println!("before = {}", item.0);
    item.increment();
    println!("after = {}", item.0);
}
Run Code Online (Sandbox Code Playgroud)

当我在调试模式下编译它时,结果符合预期,并且值确实增加了。然而,在发布模式下,尽管该部分代码运行,但该值根本不增加。此外,以下其他类型的值变异似乎也不起作用

unsafe {*&mut *(self.ptr()) += 1;}

std::mem::replace()

std::mem::swap()

  1. 这是什么原因呢?
  2. 我想要做的事情在 --release 模式下是不可能的吗?

unsafe rust

-3
推荐指数
1
解决办法
254
查看次数

标签 统计

arrays ×1

java ×1

performance ×1

rust ×1

unsafe ×1