rust java速度,将性能关键循环从C转换为Rust

我正在尝试将一些旧的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;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值