我正在寻找建议。我开发了自己的加密算法,因为我喜欢它,我可以。现在,我想尝试一个新想法。
我的想法涉及将我的算法合并为一个更大的算法。例如,你调用X.Encrypt()
然后它使用A.Encrypt()
、B.Encrypt()
、C.Encrypt()
等。当你执行这种操作时,A
B
,C
方法调用,方法开销就会变成杀手镯头。从几毫秒到几分钟。那么,有什么问题吗?
我只是在寻找代码设计技巧和窍门来减轻问题。
提前谢谢。
更新
问题的代码示例:
//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);
我不知道您的实现细节,但这不应该有开销问题。