slice performance
还没有人认领这个 Issue。
评估
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 新手友好度
- 35/100
- Issue 类型
- 缺陷
- 描述清晰度
- 需要澄清
- 活跃度
- 停滞
- 技术栈
- rust
- 领域
- performance
调研方向
Start with the reported bench_loop and bench_slice benchmarks, comparing test_loop with test_slice on the same 3x3x3 patches in an 11x11x11 Array3. Inspect the slice and azip paths in the referenced src or lib code and determine what accounts for the timing difference. Done means explaining the slowdown and identifying whether the clean implementation can match the loop without changing its result.
由索引模型根据 Issue 内容生成。
描述
Don't try to understand my first version too much, the second function is much simpler. It's simply comparing two 3x3x3 patches of data in a 11x11x11 image and returning a score. I refactored this function from
fn test_loop(data: &[f64], m: usize, n: usize, o: usize) -> f64 {
let pl = 3;
let br = 4;
let bl = 11;
let bl2 = bl * bl;
let mut sum = 0.0;
for a in 0..pl {
let idx1_a = (br + a) * bl2;
let idx2_a = (m + a) * bl2;
for b in 0..pl {
let idx1_b = (br + b) * bl;
let idx2_b = (n + b) * bl;
for c in 0..pl {
let idx1 = idx1_a + idx1_b + br + c;
let idx2 = idx2_a + idx2_b + o + c;
let diff = (data[idx1] - data[idx2]).powi(2);
sum += diff;
}
}
}
sum
}
to
fn test_slice(data: &Array3<f64>, m: usize, n: usize, o: usize) -> f64 {
let pl = 3;
let br = 4;
let s1 = data.slice(s![br..br+pl, br..br+pl, br..br+pl]);
let s2 = data.slice(s![m..m+pl, n..n+pl, o..o+pl]);
let mut sum = 0.0;
azip!(s1, s2 in { sum += (s1 - s2).powi(2) });
sum
}
Of course, I'm happy with the code quality now (!), but the clean version is surprisingly slow. I benched those 2 functions using the same data, with test_loop using &data.as_slice().unwrap() instead of &data
test bench_loop ... bench: 25 ns/iter (+/- 5)
test bench_slice ... bench: 142 ns/iter (+/- 1)
Are those results surprising to you? Both versions don't allocate, calculate the indices (in src or lib) and the sum, etc. I fail to see why the clean version is almost 6 times slower. Is slice doing something really complex?
- 主要语言
- Rust
- 星标
- 4.3k
- 派生
- 391
- PR 合并指标
- 30 天内没有已合并 PR
贡献指南
这个仓库没有索引到贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
rust-ndarray/ndarray 的其他 Issue
-
难度 2/5 1-3 小时 新手友好度 72/100
rust-ndarray/ndarray#1612 · 1 条评论 ·
-
难度 4/5 3-5 天 新手友好度 48/100
rust-ndarray/ndarray#1617 · 1 条评论 ·
-
bug good first issue
难度 3/5 1-2 天 新手友好度 68/100
rust-ndarray/ndarray#1615 · 1 条评论 ·
-
难度 4/5 3-5 天 新手友好度 48/100
rust-ndarray/ndarray#1610 ·
-
难度 3/5 1-2 天 新手友好度 72/100
rust-ndarray/ndarray#1609 ·
查看 rust-ndarray/ndarray 的全部 Issue
相似的 Issue
-
risk:low runtime status:in-progress type:test
难度 1/5 1 小时以内 新手友好度 92/100
zeroclaw-labs/zeroclaw#11023 ·
-
good first issue refactor
难度 2/5 1-3 小时 新手友好度 72/100
-
难度 2/5 1-3 小时 新手友好度 84/100
EricSpencer00/Resilient#4835 · 1 条评论 ·
-
难度 2/5 1-3 小时 新手友好度 74/100
bisq-network/bisq-musig#204 ·
-
agent:ready documentation
难度 2/5 1-3 小时 新手友好度 88/100
cesarferreira/stax#890 ·