1

我正在寻求建议。我开发了自己的加密算法,因为我喜欢它并且我可以。现在,我正在尝试一个新的想法。

我的想法涉及将我的算法合并成一个更大的算法。例如,您调用X.Encrypt()然后它使用A.Encrypt(),B.Encrypt()C.Encrypt()。当您执行这种操作时,每个A,一个字节BC方法调用的方法开销成为杀手。从几毫秒到几分钟。那么,有什么问题吗?

我只是在寻找可能减轻问题的代码设计技巧和窍门。

提前谢谢。

更新

问题的代码示例:

//fast
moduleA.Transform(true, buffer, 0, buffer.Length);
moduleB.Transform(true, buffer, 0, buffer.Length);

//slow
for (int L = 0; L < buffer.Length; )
{
    moduleA.Transform(true, buffer, L++, 1);
    moduleB.Transform(true, buffer, L++, 1);
}

我知道这个问题是如何调用它所固有的。我的目标是改变我的工作方式。我知道在 Transform 方法中可以改进。快速运行大约需要 24 秒,而慢速运行需要几分钟。显然,方法的开销,不需要分析器:)

我确实有一个想法我要尝试。我正在考虑使用“运行模式”,而不是在 Transform 方法之外循环,而是更改它在每个方法中的运行方式以满足我的需要。因此,我可以在 Transform 方法中并作为批处理执行每隔一个字节的加密。我相信这将消除我得到的开销。

最终更新(解决了我自己的问题,仍然对想法持开放态度!)

在 Transform 方法中增加循环速率已经奏效!

我所做的是以下,它似乎运作良好:

ITransformationModule moduleA = TransformationFactory.GetModuleInstance("Subspace28");
ITransformationModule moduleB = TransformationFactory.GetModuleInstance("Ataxia");
moduleA.IncrementInterval = 2;
moduleB.IncrementInterval = 2;
moduleA.Transform(true, buffer, 0, buffer.Length);
moduleB.Transform(true, buffer, 1, buffer.Length);

在我的工作虚拟机上运行 100MB 大约需要 12 秒。感谢所有贡献的人!这是一种综合反应,帮助我以这种方式尝试。我非常感谢你们!

这只是目前的概念证明。它正在朝着更大的方向发展!:)

4

5 回答 5

2

您是否通过逐字节调用方法来加密数据?为什么不对一大块数据调用该方法并在该方法中循环呢?此外,虽然尝试自己的加密方法肯定很有趣,但如果完全担心安全性,您几乎应该始终使用已知、经过测试且安全的算法。

于 2011-05-13T18:16:08.520 回答
0

您可以尝试实现您的算法,以便您的代码生成chunky callsthen chatty calls。也就是说,与其调用函数数百次,不如调用更少的函数,这样每个函数都有更多的工作要做。这是一个建议,您可能还必须使您的算法高效,这样它就不是处理器密集型的。希望这有帮助。

于 2011-05-13T18:13:12.723 回答
0

您希望从 A、B、C、D、E、F、G 等类中调用 X 类方法,而无需方法调用开销。起初,这似乎很荒谬。您也许可以使用System.Reflection.Emit找到一种方法。也就是说,动态创建一个执行 A+B+C+D+E+F+G 的方法,然后调用它。

于 2011-05-13T18:14:07.787 回答
0

首先分析您的代码,以便您知道应该首先在哪里操作,然后再询问:)

于 2011-05-13T18:20:50.327 回答
0

像这样的东西会起作用吗?当然,您必须修改它以适合您的加密参数和返回类型......

static class Encryptor
{
    delegate void Transform(bool b, byte[] buffer, int index, int length);
    static Transform[] transformers = new Transform[3];

    static Encryptor()
    {
        transformers[0] = (b, buffer, index, length) => { /*Method A*/ };
        transformers[1] = (b, buffer, index, length) => { /*Method B*/ };
        transformers[2] = (b, buffer, index, length) => { /*Method C*/ };
    }

    public static void Encrypt(bool b, byte[] buffer)
    {
        int length = buffer.Length;
        int nTransforms = transformers.Length;
        for (int i = 0; i < length;)
        {
            for (int j = 0; j < nTransforms; j++)
            {
                transformers[i % nTransforms](b, buffer, i++, 1);
            }
        }
    }
}

编辑所以这将做第二个例子

Encryptor.Encrypt(yourBoolean, yourBuffer);

我不知道你的实现细节,但这不应该有开销问题。

于 2011-05-13T18:36:16.500 回答