加密项目:需要有关如何消除方法开销的建议



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

我的想法涉及将我的算法合并为一个更大的算法。例如,你调用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);
}

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

我确实有一个想法,我要尝试。我正在考虑使用"运行模式",而不是在 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);

在我的工作 VM 上,这在 100MB 内运行的时间约为 12 秒。感谢所有做出贡献的人!正是这种反应的结合,促使我以这种方式尝试。我非常感谢你们!

这只是目前的概念证明。它正在朝着更伟大的事物前进!:)

您是否通过

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

您可以尝试实现您的算法,以便您的代码chunky calls然后chatty calls。也就是说,与其调用函数数百次,不如减少函数调用,以便每个函数有更多的工作要做。这是一个建议,您可能还必须使您的算法高效,以免占用大量处理器资源。希望这有帮助。

您希望拥有来自类 A、B、C、D、E、F、G 等的类 X 调用方法......没有方法调用开销。 乍一看,这似乎很荒谬。 你也许可以找到一种方法来使用System.Reflection.Emit来做到这一点。 也就是说,动态创建一个执行 A+B+C+D+E+F+G 的方法,然后调用它。

首先分析

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

这样

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

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);

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

最新更新