在 Rust 中,存储较大的类型更快还是存储较小的类型并始终强制转换它们更快?

2023-12-08

我正在用 Rust 开发一个国际象棋引擎。我有一个Move结构与from and to字段,它们是Square. Square是一个包含一个结构体usize,这样我在访问该职位的棋盘元素时就可以直接使用它。因为在 Rust 中索引必须用usize,我想知道处理这种情况的最快方法是什么(请注意,移动生成应该尽可能快)。我知道存储对内存更友好u8并在每次我需要将它们用作索引时投射它们,但它更快吗?解决这个问题的惯用方法是什么?

I have:

struct Square {index: usize}

fn position.at(square: Square) -> Option<Piece> {
   position.board[square.index]
}

我尝试过迁移到 u8 并每次都进行转换,结果好坏参半:

struct Square(u8)

fn position.at(square: Square) -> Option<Piece> {
   position.board[square.0 as usize]
}

Pro u8铸件:

  • 更好的缓存利用率(对象更小);但只有当有很多对象时才可能有趣

Con u8:

  • 在某些平台上,投射可能需要额外的说明;但这些通常只是CPU优化的寄存器操作

避免的惯用方法as usize: 实现一个包装器

impl Square {
    #[inline]
    pub fn index(&self) -> usize {
        self.0 as usize
    }
}

或者,当你想让它真正类型安全时,实现std::ops::Index:

struct Piece;
struct Board([Piece; 64]);

struct Square(u8);

impl std::ops::Index<Square> for Board {
    type Output = Piece;

    fn index(&self, index: Square) -> &Self::Output {
        &self.0[index.0 as usize]
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Rust 中,存储较大的类型更快还是存储较小的类型并始终强制转换它们更快? 的相关文章

随机推荐