我和一个 friend 写了一个加密模块,我们想把它移植到多种语言,这样它就不是特定于平台的加密。最初是用 C# 编写的,我已经将它移植到 C++ 和 Java 中。 C# 和 Java 都将以大约 40 MB/s 的速度加密,但 C++ 将仅以大约 20 MB/s 的速度加密。为什么 C++ 运行得这么慢?是因为我使用的是 Visual C++ 吗?
我可以做些什么来加速我的代码?是否有不同的编译器可以更好地优化 C++?
我已经尝试过优化代码本身,例如使用 x >> 3 而不是 x/8 (整数除法),或者 y & 63 而不是 y % 64 和其他技术。我如何以不同的方式构建项目,以便它在 C++ 中具有更高的性能?
编辑:
我必须承认我没有研究编译器如何优化代码。我将在大学这里上一些专门学习编译器和解释器的类(class)。
至于我的C++代码,不是很复杂。没有包含,有“基本”数学以及我们称之为“状态跳跃”的东西来产生伪随机结果。我们所做的最复杂的事情是按位运算,这些运算实际上在初始散列阶段进行加密和未经检查的乘法。有动态分配的二维数组,它们在加密对象的整个生命周期中保持事件状态(并在析构函数中正确释放)。这里只有 180 行。好的,所以我的微优化不是必需的,但我应该相信它们不是问题,是时候了。为了真正深入,这里是程序中最复杂的代码行:
输入[L + 偏移量] ^= 状态[状态[SIndex ^ 255] & 63];
我不会移动数组,也不会处理对象。
从语法上讲,整个代码集运行完美,如果我用 C# 加密某些东西并用 C++ 或 Java 解密它,它将无缝地工作,所有 3 种语言都按照您预期的方式进行交互。
我不一定期望 C++ 比 C# 或 Java 运行得更快(它们彼此相差在 1 MB/s 以内),但我确信有一种方法可以使 C++ 运行得一样快,或者至少更快那么就是现在。我承认我不是 C++ 专家,我当然不像你们中的许多人那样经验丰富,但如果我可以将 99% 的代码从 C# 剪切并粘贴到 C++ 并让它在 5分钟,然后我有点失望,因为它需要两倍的时间来执行。
重新编辑: 我在 Visual Studio 中找到了一个我之前忘记设置的优化。现在 C++ 的运行速度比 C# 快 50%。感谢所有提示,我在研究中学到了很多关于编译器的知识。
最佳答案
如果没有源代码,就很难说出您的加密算法/程序的性能。 我认为你在将它移植到 C++ 时犯了一个“错误”,这意味着你以低效的方式使用它(例如,发生了大量的对象复制)。也许您还使用了 VC 6,而 VC 9 会/可能会生成更好的代码。
至于“x >> 3”优化……现代编译器确实会自行将整数除法转换为位移位。不用说,这种优化可能根本不是您程序的瓶颈。您应该首先对其进行概要分析,以找出您将大部分时间花在哪里:)
关于C# 比 C++ 运行得更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1421697/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
GivenIamadumbprogrammerandIamusingrspecandIamusingsporkandIwanttodebug...mmm...let'ssaaay,aspecforPhone.那么,我应该把“require'ruby-debug'”行放在哪里,以便在phone_spec.rb的特定点停止处理?(我所要求的只是一个大而粗的箭头,即使是一个有挑战性的程序员也能看到:-3)我已经尝试了很多位置,除非我没有正确测试它们,否则会发生一些奇怪的事情:在spec_helper.rb中的以下位置:require'rubygems'require'spork'
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
是否有可能:before_filter:authenticate_user!||:authenticate_admin! 最佳答案 before_filter:do_authenticationdefdo_authenticationauthenticate_user!||authenticate_admin!end 关于ruby-on-rails-before_filter运行多个方法,我们在StackOverflow上找到一个类似的问题: https://