Multithreading 线程DES比未线程DES慢

Multithreading 线程DES比未线程DES慢,multithreading,rust,Multithreading,Rust,我很难通过并行DES加密算法来提高性能 以下是我的尝试: fn des(message: &[u8], subkeys: Vec<u64>) -> Vec<u8> { let mut pool = Pool::new(THREAD_COUNT); let message = message_to_u64s(message); crossbeam::scope(|scope| { pool.map(scope, mes

我很难通过并行DES加密算法来提高性能

以下是我的尝试:

fn des(message: &[u8], subkeys: Vec<u64>) -> Vec<u8> {
    let mut pool = Pool::new(THREAD_COUNT);
    let message = message_to_u64s(message);

    crossbeam::scope(|scope| {
        pool.map(scope, message.iter().enumerate(), |(i, &block)| {
            let permuted = ip(block);
            let mut li = permuted & 0xFFFFFFFF00000000;
            let mut ri = permuted << 32;

            for subkey in &subkeys {
                let last_li = li;
                li = ri;
                ri = last_li ^ feistel(ri, *subkey);
            }

            let r16l16 = ri | (li >> 32);
            to_u8_vec(fp(r16l16))
        }).collect::<Vec<_>>()
    }).concat()
}
我相信
collect
concat
是问题所在,但我不知道如何在不使用不安全代码的情况下避免它们

那么,如何使用安全代码(通过使用线程)提高该算法的性能呢?
(带有不安全代码的解决方案也很有趣,但我相信一定有一个没有不安全代码的解决方案)

使用探查器。你可以试着猜测经济放缓的地方,但无论如何,你可能找不到合适的地方


但是对于一个有根据的猜测。。。我会尝试将消息拆分为
THREAD\u COUNT
部分,并将这些部分提供给线程池。如果您单独发送8字节的片段,您将花费更多的时间来管理它,而不是DES本身。

使用探查器。你可以试着猜测经济放缓的地方,但无论如何,你可能找不到合适的地方


但是对于一个有根据的猜测。。。我会尝试将消息拆分为
THREAD\u COUNT
部分,并将这些部分提供给线程池。如果您单独发送8字节的片段,您将花费更多的时间来管理它,而不是DES本身。

这是每个字节1个线程吗?我可以想象线程旋转的开销是导致基于输入的速度减慢的原因。似乎到处使用
&[u8]
&[u64]
比使用
Vec
更简单。这是每字节1个线程吗?我可以想象线程旋转的开销是导致基于输入的速度减慢的原因。似乎到处使用
&[u8]
&[u64]
比使用
Vec
更简单。感谢您的回答。你是对的:我不得不把信息分开。我尝试了
valgrind
分析应用程序,但它只表明大部分时间都花在关闭线程上:我怎么能从这样的分析结果中猜出您的解决方案?很有趣。。。我还没试过仿形螺纹锈。如果您只列出了闭包,而没有收集,等等。这本身可能是一个好问题。理想情况下,每行配置文件在这里会很有用。viraptor:我没有使用调试符号编译。有了它们,我看到了更多的函数调用,但我仍然不知道如何猜测这个问题。我看到的两个
valgrind
输出之间的一个明显区别是,在我的初始版本中,闭包被调用了很多时间。我认为这是一种判断使用了太多线程的方法,对吗?谢谢,谢谢你的回答。你是对的:我不得不把信息分开。我尝试了
valgrind
分析应用程序,但它只表明大部分时间都花在关闭线程上:我怎么能从这样的分析结果中猜出您的解决方案?很有趣。。。我还没试过仿形螺纹锈。如果您只列出了闭包,而没有收集,等等。这本身可能是一个好问题。理想情况下,每行配置文件在这里会很有用。viraptor:我没有使用调试符号编译。有了它们,我看到了更多的函数调用,但我仍然不知道如何猜测这个问题。我看到的两个
valgrind
输出之间的一个明显区别是,在我的初始版本中,闭包被调用了很多时间。我认为这是一种判断使用了太多线程的方法,对吗?谢谢
fn des(message: &[u8], subkeys: Vec<u64>) -> Vec<u8> {
    let message = message_to_u64s(message);

    let mut cipher = vec![];

    for block in message {
        let permuted = ip(block);
        let mut li = permuted & 0xFFFFFFFF00000000;
        let mut ri = permuted << 32;

        for subkey in &subkeys {
            let last_li = li;
            li = ri;
            ri = last_li ^ feistel(ri, *subkey);
        }

        let r16l16 = ri | (li >> 32);
        let mut bytes = to_u8_vec(fp(r16l16));
        cipher.append(&mut bytes);
    }

    cipher
}