sprintf 与 String.Format 的性能[重复]

2024-06-25

我正在比较 sprintf 用法的性能,并对我所看到的感到有点困扰。我测试了以下 4 个方法,将 ClassWithToString 的实例传递给每个方法(PrintInt 除外,它接收实际的整数值)。

type ClassWithToString() =
    member this.X = 42
    override this.ToString() = this.X.ToString()

let Print item : string =
    sprintf "%A" item

let PrintInt item: string =
    sprintf "%i" item

let PrintObj item: string =
    sprintf "%O" item

let Format item : string =
    System.String.Format("{0}", item)

50,000 次迭代的结果:

Print (%A):     3143ms
PrintInt (%i):   355ms
PrintObj (%O):   384ms
Format:            8ms

对于“打印”,我知道 %A 正在使用反射,因此缓慢的情况并不令人震惊,尽管对于 50k 次迭代,我对总时间感到惊讶。接下来,“PrintInt”和“PrintObj”不使用反射,因此速度快一个数量级,这也是有道理的。

让我感到困惑的是,鉴于结果String.Format()sprintf 总体上看起来非常慢(并且已经在实时应用程序的配置文件中见证过)。为什么 sprintf 的速度比 String.Format() 慢?我错过了 F# 领域是否有更好的替代方案?


只有 %A 使用反射。 %i 将是基本情况。

这不是真的。全部printf无论您使用哪个说明符,函数都需要反射来从格式字符串构造类型安全的打印函数。看一眼这条线 https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/printf.fs#L319 and 这条线 https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/printf.fs#L215 from printf模块以获得更多见解。所以很容易明白为什么sprintf "%i"仍然慢于String.Format。 如果是sprintf "%A",它还有一层反射,这解释了它可怕的缓慢。

我错过了 F# 领域是否有更好的替代方案?

如果你的目的是构建大字符串,字符串编写器 http://msdn.microsoft.com/en-us/library/system.io.stringwriter.aspx and 字符串生成器 http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx可能是要走的路。如果您出于记录目的进行基准测试,快速打印函数 http://t0yv0.blogspot.com/2012/09/faster-printf-released-on-nuget.html是一个很有前途的图书馆。你可以尝试一下这个 NuGet 包 http://nuget.org/packages/FastPrintf/据称比内置的快 100 倍printf功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sprintf 与 String.Format 的性能[重复] 的相关文章

  • Web API 帮助页面显示每个方法的两个版本

    如何避免帮助页面显示我的方法的两个版本 正如你所看到的 我已经设置了一条自定义路线 api property search finnId 但我不希望使用查询参数的那个出现在 帮助 页面中 有办法解决这个问题吗 我正在使用 ASP NET F
  • JIT编译后的代码是如何注入内存并执行的?

    考虑一个典型的 Windows x86 或 AMD64架构 内存为 分为可执行部分 无法写入 和 数据部分 可以写入但不能写入 被处决 想想 DEP JIT 在内存中编译方法 通常 不存储任何东西 磁盘 而是将其移动到哪里 下一条指令指针可
  • 寻找系统、全面、完整的VB.NET和C#语法比较

    我是一名经验丰富的 VB NET 开发人员 想从 C 开始 我正在寻找两种语言语法之间基于网络的比较作为快速参考 我发现自己正在整理 VB NET 语法模板 例如 Public MustInherit Class BaseClass Pub
  • 如何在 PHP 中按字母顺序比较 2 个字符串?

    标题说什么 具体来说 如果我有 array1 name zoo array2 name fox 我怎样才能确定按字母顺序排列 array2的名字应该出现在上面 array1 s Use strcmp http www php net str
  • 如何将对象转换为元组?

    我创建元组并将其添加到组合框中 comboBox1 Items Add new Tuple
  • 在没有实现 IEnumerable 的情况下,我们的自定义类数组如何与 foreach 一起使用?

    这个长标题已经包含了我所有的问题 所以我只想举个例子 MyClass array 在不实现 IEnumerable 接口方法的情况下 该数组如何与 Foreach 一起使用 Array http msdn microsoft com en
  • 将整数转换为其 ascii 值的字符串

    给定一个数字number这样它的数字被分组为长度的部分n 默认值为n是3 其中每个组代表一些ascii值 我想转换number转换为这些 ASCII 字符的字符串 例如 n number Output 3 70 F 3 6506606606
  • 调试调用 .Net(C#) dll 的 VB6 项目

    我已经被这个问题困扰了几个小时了 我希望有人遇到过类似的问题 我们使用 VS2010 开发了一个原型 Net C dll 并希望能够在 C 应用程序和 VB6 应用程序中调用该 dll 我的问题是 是否可以调试调用 Net dll 的 VB
  • 如何使用 C++ 字符串流追加 int?

    谁能告诉我或给我一个简单的例子 说明如何将 int 附加到包含单词 Something 或任何单词 的字符串流中 stringstream ss ss lt lt Something lt lt 42 为了将来参考 请查看此内容 http
  • Java 与 C++ - 光线追踪

    我用 Java 创建了简单的光线追踪器作为一个业余爱好项目 但是它很慢 虽然速度不是特别慢 但还是很慢 我想知道使用 C 或 C 等较低级语言是否可以获得任何性能提升 或者差异可以忽略不计 我应该坚持改进 我的 算法吗 我认为这个问题的答案
  • 按组渐进串联列[重复]

    这个问题在这里已经有答案了 假设我有这个输入 ID date 1 date 2 str 1 1 2010 07 04 2008 01 20 A 2 2 2015 07 01 2011 08 31 C 3 3 2015 03 06 2013
  • 对于 X 中的每个元素,找到最大的索引,而不会超出 Y 中的范围

    我正在寻找一种方法来提高以下算法的性能 给定两个数组 X 和 Y 对于 X 的每个元素 找到 Y 中不超过 X 中元素值的最大值的索引 可以安全地假设 X 和 Y 是单调递增 已排序 并且 Y 1 小于每个X 中的值 而且 X 通常比 Y
  • “内存泄漏”剖析

    从 NET 角度来看 什么是内存泄漏 https en wikipedia org wiki Memory leak 如何确定您的应用程序是否存在泄漏 有什么影响 如何防止内存泄漏 如果您的应用程序存在内存泄漏 当进程退出或被终止时它会消失
  • 在异步方法中使用时 HttpClient 标头被清空

    我正在使用 NET Framework 4 6 1 我的 Web api 中有一个控制器 其中有静态 HttpClient 来处理所有 http 请求 在 IIS 上托管我的应用程序后 大约每月一次 我的应用程序的所有传入请求都会出现以下异
  • 如何处理作为参数传递到方法中的 Lambda 表达式 - C# .NET 3.5

    我对 Lambda 表达式的了解有点不稳定 虽然我可以编写使用 Lambda 表达式 又名 LINQ 的代码 但我正在尝试编写自己的方法 该方法采用一些 Lambda 表达式类型的参数 背景 我正在尝试编写一个方法 该方法从任何其他对象类型
  • VS2010中VSHost.exe不断启动

    我正在 VS2010 中使用一个包含大量项目的解决方案 但它不断变得无响应 我注意到的一件事可能是一条线索 尽管我尚未开始任何调试 但 MyApplicationName vshost exe 不断出现在进程列表中 也许每当构建发生时它就会
  • 如何在Java中验证字符串是否是有效的URL(包括深层链接)[重复]

    这个问题在这里已经有答案了 如何在 Java 中验证字符串是否是有效的 URL 包括深层链接 对于以下测试用例 该方法应返回 true http www example com gizmos https www example com gi
  • Java Reflection:为什么这么慢?

    我一直避免使用 Java 反射 因为它速度缓慢 我在当前项目的设计中达到了一个点 能够使用它将使我的代码更具可读性和优雅性 所以我决定尝试一下 我只是对这种差异感到惊讶 我注意到有时运行时间几乎延长了 100 倍 即使在这个简单的例子中 它
  • 合并大文件的最佳方法是什么?

    我必须合并数千个大文件 每个大约 200MB 我想知道合并这些文件的最佳方法是什么 行将有条件地复制到合并文件中 可以使用 File AppendAllLines 或使用 Stream CopyTo 吗 使用 File AppendAllL
  • 由于表扫描,表值参数的性能较低

    我有一个将参数传递给 SQL 过程的应用程序 其中一个参数是表值参数 其中包含要包含在 where 子句中的项目 因为当我将 TVP 连接到具有 200 万行的表时 表值参数没有附加任何统计信息 所以查询速度非常慢 我还有什么选择 同样 目

随机推荐

  • 通过systemd服务启动烧瓶

    有一个systemd服务文件 etc systemd system flask app service Unit Description flask app After network target Service User root Wo
  • VueJS:以冒号为前缀的 html 属性表示什么?

    Example
  • 回调在 Angular2/Firebase 中生成“TypeError:这是未定义的”

    我试图了解这里发生了什么以及为什么如果我以某种方式调用函数时会收到错误 而当我以不同的方式调用函数时却不会收到错误 这是首先产生错误的方式 播放器 service ts 文件 in the Injectable i have private
  • 从 subversion 标签自动构建

    我正在尝试自动化工程组的构建过程 作为自动化的一部分 我试图达到这样的程度 应用遵循某种模式的特定标签的行为将启动一个自动化过程 该过程将执行以下操作 查看源代码 从模板创建构建脚本 构建项目 我非常确定我可以使用 subversion 中
  • 将 Base64 解码的 NSData 转换为 NSString

    我正在尝试对 Base64 数据进行编码和解码 但是在解码 Base64 数据时 它返回一堆十六进制值 但我无法使用 NSlog 显示或打印原始可读字符串 下面的代码无法打印任何内容 只是空的 有人可以帮忙吗 谢谢 gt gt NSStri
  • 如何指定 JBoss AS7 中的 Web 应用程序使用哪个安全域?

    我正在使用 JBoss AS7 JSF 2 1 我正在尝试使用数据库登录模块对我的 Web 应用程序中特定资源的用户进行身份验证 在standalone xml中有3个安全域 other jboss web policy 和 jboss e
  • OOP:什么时候它是一个对象?

    我正在尝试理解面向对象 我当然明白一点 但有时我并不是百分百清楚 你如何决定什么应该变成一个对象 另一个大的整个对象的小对象部分 或者什么不值得成为一个对象 或者也许它应该只是那个大的整个对象的属性 对于一扇门来说 我猜门把手应该是一个独立
  • “==”对象相等的标准定义是什么?

    There seems与普遍理解之间的不匹配 以及它的实际作用 给出这个问题的一些背景 typeof new Number 1 returns object typeof new String 1 returns object typeof
  • 如何非递归地捕获 ImportError?

    假设我们要导入一个名为user py 这可能会失败 try import user except ImportError logging info No user script loaded 我们怎样才能确保只捕获可能的导入失败user p
  • JavaScript 无法在 HTML 文件中运行

    我已阅读有关此主题的可用链接 但它们没有帮助 我正在尝试运行以下代码 menu html 在另一个页面的 div 中加载 world html 并且显示 HTML 但不显示 JavaScript 起初 我将 JS 放在一个单独的文件中 但当
  • std::function<> 和标准函数指针之间的区别? [复制]

    这个问题在这里已经有答案了 std function 和标准函数指针有什么区别 that is typedef std function
  • Python Tkinter Tk 支持清单框吗?

    我正在尝试在 GUI 中创建清单框 可以做 Tkinter 吗 我不想要复选框列表 我知道 Python Wx GUI 开发有这种支持 但我正在寻找 Tk 中的支持 如果有人有想法 请分享详细信息或方法的链接 Tkinter 没有像 wxP
  • 回发在 Firefox 中对 asp.net(C#) 页面不起作用

    我的 mozilla 火狐浏览器有问题 我正在使用 ASP NET 语言开发一个网站 并且在表单中有一个按钮 当我单击 onclick 属性上的按钮时 我正在调用一个函数 并且该函数执行回发 此场景适用于 Chrome 和 Internet
  • python 从字符串创建对象

    我有下一个情况 以下方法的目标是返回从传入字符串创建的对象 所以我有 class Situation Generator pass 以及父类中的方法 class Generator object def createsituation se
  • psql 的备用输出格式显示每行一列以及列名

    我在 Ubuntu 上使用 PostgreSQL 8 4 我有一个带有列的表格c1通过cN 这些列足够宽 选择所有列会导致一行查询结果多次换行 因此 输出很难阅读 当查询结果仅包含几行时 如果我可以查看查询结果 使得每行的每一列都位于单独的
  • 更改 sqlite 中列中的值

    我需要更新某个表中的列中的值 我试过这个 public void updateOneColumn String TABLE NAME String Column String rowId String ColumnName String n
  • 从元组/数组值派生联合类型

    假设我有一个数组 const list a b c 是否可以从这个值联合类型派生出 a b c 我想要这个是因为我想定义只允许来自静态数组的值的类型 并且还需要在运行时枚举这些值 所以我使用 array 如何使用索引对象实现它的示例 con
  • Tomcat垃圾收集频率

    我是 Java 新手 刚刚继承了 Tomcat 设置 所以我需要一些指导 上周我读到的有关 JVM 调优和垃圾收集算法的内容超出了我的预期 使用 Visual VM GC 我们的 Tomcat 服务器每天执行的完整 GC 次数少于一次 考虑
  • Celery:与正在运行的任务交互/通信

    一个相关的 尽管不相同 问题出现在这里 与 celery 正在进行的任务交互 https stackoverflow com questions 30481996 interact with celery ongoing task 启动任务
  • sprintf 与 String.Format 的性能[重复]

    这个问题在这里已经有答案了 我正在比较 sprintf 用法的性能 并对我所看到的感到有点困扰 我测试了以下 4 个方法 将 ClassWithToString 的实例传递给每个方法 PrintInt 除外 它接收实际的整数值 type C