我正在尝试将一些旧的C代码重写为Rust - 我是新手 . 我遇到的一个反复出现的问题是C代码有很多这样的循环:
for (i = startIndex; i < asize; i++)
{
if (firstEdge < 0 && condLeft(i))
{
firstEdge = i;
}
RightIndex = asize-1-i;
if (firstEdgeRight < 0 && condRight(RightIndex))
{
firstEdgeRight = RightIndex;
}
// Found both edges
if (firstEdge >= 0 && firstEdgeRight >= 0) {
break;
}
}
你会如何以高效的方式将其转化为Rust?我的问题是,虽然我可能得到我想要的功能,但我不确定如何获得(大致)相同的速度 .
这部分代码是我们代码中的主要瓶颈(至少这部分代码),并且在翻译时它希望保留以下属性 .
循环应该尽快破坏,因为 asize 可能非常大 .
firstEdge 和 firstEdgeRight 大致同时发现 . 因此,只有一个循环而不是两个循环是一件好事 - 为了避免再次从头开始搜索(即使我认为这个解决方案杀死了预取器(但我甚至有一个预取器)) .
虽然性能很重要,但可读性当然更为重要:)
EDIT 好的,这是我可能的Rust实现( cond_right() 和 cond_left() 被遗漏了) . 我想到的是:
这是否是其他人如果必须从头开始实施的话呢?
我真的需要制作 first_edge 和 first_edge_right 可变吗?它们在我的实现中,但我感觉不对,因为它们只被分配一次 .
let mut first_edge = -1;
let mut first_edge_right = -1;
// Find first edge
let start_index = 300; // or something
let asize = 10000000;
for i in start_index..asize {
if first_edge < 0 && cond_left(i) {
first_edge = i;
}
let right_index = asize - i -1;
if first_edge_right < 0 && cond_right(right_index) {
first_edge_right = right_index;
}
if (first_edge >= 0 && first_edge_right >= 0) {
break;
}
}