Performance 通过混淆造成的性能损失?

Performance 通过混淆造成的性能损失?,performance,obfuscation,Performance,Obfuscation,我读过,好的模糊处理技术不仅可以用模糊的东西替换方法名,还可以用字节数组替换源代码中的字符串,并添加方法将其转换回原始字符串 这可能是导致基于观点的答案的问题之一,但我还是要问:如果应用了这种模糊处理方法,应用程序会遭受多大的性能损失,有没有一般的概念?我想到了一种严重依赖数据库的软件,即代码中存在查询,例如,作为C#strings或StringBuilder实体。是的,字符串混淆在微观层面上对性能有重大影响。使用模糊处理时,您没有直接的内存查找,而是需要(每次)执行代码,而且它通常有点复杂,因

我读过,好的模糊处理技术不仅可以用模糊的东西替换方法名,还可以用字节数组替换源代码中的字符串,并添加方法将其转换回原始字符串


这可能是导致基于观点的答案的问题之一,但我还是要问:如果应用了这种模糊处理方法,应用程序会遭受多大的性能损失,有没有一般的概念?我想到了一种严重依赖数据库的软件,即代码中存在查询,例如,作为C#
string
s或
StringBuilder
实体。

是的,字符串混淆在微观层面上对性能有重大影响。使用模糊处理时,您没有直接的内存查找,而是需要(每次)执行代码,而且它通常有点复杂,因此在微观性能级别上必然要差得多

然而,成本通常并不重要;数据库调用(或显示UI对话框,或将错误发送到日志,或网络流量,或…)所需的时间将比转换字符串的成本高出几个数量级。在大多数情况下,转换成本基本上是无形的


与所有事情一样,仔细测试是明智的,但通常只有在已经对CPU性能敏感的紧密循环中访问模糊字符串时,成本才会“可见”。

是的,字符串模糊在微观层面上对性能有显著影响。使用模糊处理时,您没有直接的内存查找,而是需要(每次)执行代码,而且它通常有点复杂,因此在微观性能级别上必然要差得多

然而,成本通常并不重要;数据库调用(或显示UI对话框,或将错误发送到日志,或网络流量,或…)所需的时间将比转换字符串的成本高出几个数量级。在大多数情况下,转换成本基本上是无形的


与所有事情一样,仔细的测试是明智的,但通常只有在已经对CPU性能敏感的紧密循环中访问模糊字符串时,成本才会“可见”。

很好,谢谢你的否决票。我可以举个例子吗?它说“否决票应该保留在极端情况下。这并不是用来代替交流和编辑。”我不一定反对否决票本身,但至少告诉我出了什么问题。就我所知,你可能仅仅因为我写了C#而不是Java就投了反对票。很好,谢谢你的反对票。我可以举个例子吗?它说“否决票应该保留在极端情况下。这并不是用来代替交流和编辑。”我不一定反对否决票本身,但至少告诉我出了什么问题。就我所知,你很可能只是因为我写了C#而不是Java就投了反对票。尽管模糊处理可能会增加逻辑的复杂性并阻碍调试,从而导致成本增加,从而有效地减少了开发人员进行优化的时间,并使此类工作变得更加困难。@doynax我的理解是,模糊处理,至少在其自动体现中,只有在我使用完软件并准备好发布之后,我才会将其添加到编译循环中。如果我理解正确的话,混淆会影响我的算法逻辑,从而使之前优化代码的工作无效。这是真的吗?@Informagic:唉,我们中的大多数人都被要求在发布后调试应用程序错误并分析使用情况,这时你可能会花时间解开混淆的代码。这与您最终调试发布版本的原因大致相同。除静态代码翻译外,还有其他常用的方案,例如数据集和通信通道经常被加密。归根结底,研究真实的代码和数据流是发现优化机会的最有效的策略之一,因此将其变得更加困难是有问题的。@doynax啊,这一点很好。我想这才是真正需要考虑安全性和可维护性之间的成本权衡的问题。确实存在“优化混淆者”,例如EasFasCtoR.NET。尽管模糊处理可能会增加逻辑的复杂性并阻碍调试,从而导致成本增加,从而有效地减少了开发人员进行优化的时间,并使此类工作变得更加困难。@doynax我的理解是,模糊处理,至少在其自动体现中,只有在我使用完软件并准备好发布之后,我才会将其添加到编译循环中。如果我理解正确的话,混淆会影响我的算法逻辑,从而使之前优化代码的工作无效。这是真的吗?@Informagic:唉,我们中的大多数人都被要求在发布后调试应用程序错误并分析使用情况,这时你可能会花时间解开混淆的代码。这与您最终调试发布版本的原因大致相同。除静态代码翻译外,还有其他常用的方案,例如数据集和通信通道经常被加密。归根结底,研究真实的代码和数据流是发现优化机会的最有效的策略之一,因此将其变得更加困难是有问题的。@doynax啊,这一点很好。我想这才是真正需要考虑安全性和可维护性之间的成本权衡的因素。有“优化混淆者”,如EasFasCtoR.NET。