开始微优化并不是我的目标,所以如果这就是结果,我会很乐意放弃这个问题。但我即将开始做出一些设计决策,并希望了解更多信息。
我正在读取和处理一种文件格式,其中包含大量以定义明确的格式记录的数据结构。我在代码中将它们表示为结构。
现在,如果我用 #pragma pack(1) 将结构打包成一个 1 字节对齐,我可以从 IO 流中直接读取结构到结构指针。这很方便。如果我不打包结构,我可以一个一个地fread 字段或一次fread block 然后reinterpret_cast 结构字段一个接一个,这可能会很快变老。
作为引用,这些结构将(可能)被成千上万的人读取,并且可以对它们进行一些数字运算。它们主要由无符号 16 位整数(约 60%)、无符号 32 位整数(约 30%)和一些 64 位整数组成。
所以手头的问题是,我...
害怕?最佳答案
最终,解决方案 A 和解决方案 B 之间的性能差异只能通过基准测试来确定。在互联网上询问会给您不同的结果,这些结果可能反射(reflect)也可能不反射(reflect)您的情况。
当您“错位”数据时会发生什么情况是处理器需要对一份数据进行多次读取 [并且同样适用于写入]。究竟需要多少额外时间取决于处理器——一些处理器不会自动执行,因此运行时系统将捕获“错误读取”并在某些仿真层中执行读取[或者,在某些处理器中,简单地杀死“未对齐内存访问”的过程]。显然,采取陷阱并执行几个读取操作然后返回调用代码会对性能产生相当大的影响 - 它很容易比对齐读取操作多花费数百个周期。
在 x86 的情况下,它“像您期望的那样工作”,但通常会增加 1 个额外的时钟周期 [假设数据已经在 L1 缓存中]。一个时钟周期在现代处理器中不是很多,但是如果循环的迭代次数为 10000000000000 次并且读取未对齐的数据 n 次,那么您现在已将 n * 10000000000000 个时钟周期添加到执行时间,这可能很重要。
其他替代方案也会对性能产生影响。进行大量小读取可能比进行一次大读取慢很多。从性能的角度来看,转换功能可能更好。
再次重申,请不要将此视为“给定的”,您确实需要比较不同的解决方案(或选择一个,如果性能不差,代码也不难看,那就放弃吧在那)。我相当相信您可以为您建议的“最佳”三种解决方案中的每一种找到案例。
另请记住,#pragma pack 是特定于编译器的,并且实现允许您在“Microsoft”和“gcc”解决方案之间进行选择的宏并不容易,例如。编辑:看起来最近的 gcc 版本确实支持这个选项——但不是所有的编译器都支持。
关于c++ - "Packing"结构对性能有何影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16108956/
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最