解析性能(If、TryParse、Try-Catch)

2023-12-12

我了解很多处理解析文本以获取信息的不同方法。例如,对于解析整数,可以预期什么样的性能。我想知道是否有人知道这方面的任何好的统计数据。我正在从测试过这个的人那里寻找一些真实的数字。

其中哪一个在哪些情况下提供最佳性能?

Parse(...)  // Crash if the case is extremely rare .0001%

If (SomethingIsValid) // Check the value before parsing
    Parse(...)

TryParse(...) // Using TryParse

try
{
    Parse(...)
}
catch
{
    // Catch any thrown exceptions
}

总是使用T.TryParse(字符串str,输出T值)。抛出异常的代价是昂贵的,如果你能处理这种情况就应该避免a priori。使用 try-catch 块来“节省”性能(因为无效数据率很低)是对异常处理的滥用,而牺牲了可维护性和良好的编码实践。遵循良好的软件工程开发实践,编写测试用例,运行应用程序,然后进行基准测试和优化。

“我们应该忘记小效率,大约 97% 的情况下:过早的优化是万恶之源。然而,我们不应该放弃这关键的 3% 的机会”——Donald Knuth

因此,您可以像碳信用额一样任意指定 try-catch 的性能是worseTryParse 的性能是better。只有在我们运行应用程序并确定我们有某种速度减慢之后。字符串解析我们是否会考虑使用 TryParse 以外的任何东西。

(编辑:由于发问者似乎希望计时数据与好的建议相结合,因此这里是所请求的计时数据)

用户 10,000 个输入的各种失败率的时间(对于不相信的人):

Failure Rate      Try-Catch          TryParse        Slowdown
  0%           00:00:00.0131758   00:00:00.0120421      0.1
 10%           00:00:00.1540251   00:00:00.0087699     16.6
 20%           00:00:00.2833266   00:00:00.0105229     25.9
 30%           00:00:00.4462866   00:00:00.0091487     47.8
 40%           00:00:00.6951060   00:00:00.0108980     62.8
 50%           00:00:00.7567745   00:00:00.0087065     85.9
 60%           00:00:00.7090449   00:00:00.0083365     84.1
 70%           00:00:00.8179365   00:00:00.0088809     91.1
 80%           00:00:00.9468898   00:00:00.0088562    105.9
 90%           00:00:01.0411393   00:00:00.0081040    127.5
100%           00:00:01.1488157   00:00:00.0078877    144.6


/// <param name="errorRate">Rate of errors in user input</param>
/// <returns>Total time taken</returns>
public static TimeSpan TimeTryCatch(double errorRate, int seed, int count)
{
    Stopwatch stopwatch = new Stopwatch();
    Random random = new Random(seed);
    string bad_prefix = @"X";

    stopwatch.Start();
    for(int ii = 0; ii < count; ++ii)
    {
        string input = random.Next().ToString();
        if (random.NextDouble() < errorRate)
        {
           input = bad_prefix + input;
        }

        int value = 0;
        try
        {
            value = Int32.Parse(input);
        }
        catch(FormatException)
        {
            value = -1; // we would do something here with a logger perhaps
        }
    }
    stopwatch.Stop();

    return stopwatch.Elapsed;
}

/// <param name="errorRate">Rate of errors in user input</param>
/// <returns>Total time taken</returns>
public static TimeSpan TimeTryParse(double errorRate, int seed, int count)
{
    Stopwatch stopwatch = new Stopwatch();
    Random random = new Random(seed);
    string bad_prefix = @"X";

    stopwatch.Start();
    for(int ii = 0; ii < count; ++ii)
    {
        string input = random.Next().ToString();
        if (random.NextDouble() < errorRate)
        {
           input = bad_prefix + input;
        }

        int value = 0;
        if (!Int32.TryParse(input, out value))
        {
            value = -1; // we would do something here with a logger perhaps
        }
    }
    stopwatch.Stop();

    return stopwatch.Elapsed;
}

public static void TimeStringParse()
{
    double errorRate = 0.1; // 10% of the time our users mess up
    int count = 10000; // 10000 entries by a user

    TimeSpan trycatch = TimeTryCatch(errorRate, 1, count);
    TimeSpan tryparse = TimeTryParse(errorRate, 1, count);

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

解析性能(If、TryParse、Try-Catch) 的相关文章

  • C# 静态类型不能用作参数

    public static void SendEmail String from String To String Subject String HTML String AttachmentPath null String Attachme
  • 格式说明符%02x

    我有一个简单的程序 include
  • C#.Net 邮件将进入垃圾邮件文件夹

    我正在从 ASP net Web 应用程序发送电子邮件 邮件发送成功 没有失败 但大多数都进入了垃圾邮件文件夹 请帮助我克服垃圾邮件过滤器 我的发送邮件代码 public void SendMail string FromAddress s
  • 在 C 语言中,为什么数组的地址等于它的值?

    在下面的代码中 指针值和指针地址与预期不同 但数组值和地址则不然 怎么会这样 Output my array 0022FF00 my array 0022FF00 pointer to array 0022FF00 pointer to a
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • 防止控制台应用程序中的内存工作集最小化?

    我想防止控制台应用程序中的内存工作集最小化 在Windows应用程序中 我可以这样做覆盖 SC MINIMIZE 消息 http support microsoft com kb 293215 en us fr 1 但是 如何在控制台应用程
  • 混合模型优先和代码优先

    我们使用模型优先方法创建了一个 Web 应用程序 一名新开发人员进入该项目 并使用代码优先方法 使用数据库文件 创建了一个新的自定义模型 这 这是代码第一个数据库上下文 namespace WVITDB DAL public class D
  • 如何向 Mono.ZeroConf 注册服务?

    我正在尝试测试 ZeroConf 示例http www mono project com Mono Zeroconf http www mono project com Mono Zeroconf 我正在运行 OpenSuse 11 和 M
  • 用于在标头更改时重新编译的简单 C 项目的示例 makefile

    有谁有完整的 makefile 可以执行以下操作 如果 HEADER 文件发生更改 则重建项目 cpp 文件在 makefile 中列出 头文件未在 makefile 中列出 头文件允许与 cpp 文件具有不同的名称 部分cpp文件没有头文
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • 来自嵌入图像的 BitmapSource

    我的目标是在 WPF 窗口上重写 OnRender 方法中绘制图像 someImage png 它是嵌入资源 protected override void OnRender System Windows Media DrawingCont
  • LinkLabel 无下划线 - Compact Framework

    我正在使用 Microsoft Compact Framework 开发 Windows CE 应用程序 我必须使用 LinkLabel 它必须是白色且没有下划线 因此 在设计器中 我将字体颜色修改为白色 并在字体对话框中取消选中 下划线
  • 在 azure blob 存储中就地创建 zip 文件

    我将文件存储在 Blob 存储帐户内的一个容器中 我需要在第二个容器中创建一个 zip 文件 其中包含第一个容器中的文件 我有一个使用辅助角色和 DotNetZip 工作的解决方案 但由于 zip 文件的大小最终可能达到 1GB 我担心在进
  • 如何在多线程应用程序中安全地填充数据并 Refresh() DataGridView?

    我的应用程序有一个 DataGridView 对象和一个 MousePos 类型的列表 MousePos 是一个自定义类 它保存鼠标 X Y 坐标 类型为 Point 和该位置的运行计数 我有一个线程 System Timers Timer
  • Unity3D - 将 UI 对象移动到屏幕中心,同时保持其父子关系

    我有一个 UI 图像 它的父级是 RectTransform 容器 该容器的父级是 UI 面板 而 UI 面板的父级是 Canvas 我希望能够将此 UI 图像移动到屏幕中心 即画布 同时保留父级层次结构 我的目标是将 UI 图像从中心动画
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调

随机推荐

  • 不带参数的 git filter-branch 有什么作用?

    什么是git filter branch没有争论吗 我在我的仓库上运行了这个 不小心过早地按了回车键 没有什么 它似乎计算了哈希值并没有发现任何变化
  • ActionScript 2 缺乏 Flash ActionScript 3 功能

    自从 Adob e 随 Flash Player 9 引入 ActionScript 3 以来 我们中的许多人转换得很慢 简而言之 我想知道 AS3 作为一个框架可以做什么 这在 AS2 中是根本不可能或非常困难的 我不是在谈论现成的组件
  • 如何从 java servlet 中的 POST 数据中分离出查询字符串参数

    当您在 servlet 中收到 doGet 或 doPost 调用时 您可以使用getparameterxxx 在一个简单的地方获取查询字符串或发布数据 如果调用是 GET 您可以从 url 查询字符串获取数据 如果调用是 POST 您将获
  • CPU 如何从 RAM 访问应用程序和数据

    在应用程序加载到 RAM 并打开文件后 因此文件的数据也存储在 RAM 中 我在理解 CPU 如何从 RAM 访问应用程序和数据时遇到了一些困难 根据我的理解 CPU 只是在程序计数器滴答时从 RAM 获取指令或在中断后执行任务 那么它如何
  • 在 protobuf 消息中存储单个字节

    我使用什么数据类型在协议缓冲区消息中存储单个字节 查看列表位于https developers google com protocol buffers docs proto scalar似乎 int32 类型之一是最合适的 有没有更有效的方
  • 使用比较运算符比较 time_t 值

    我有2个time t值 我想找出哪一个更大 time t是内部的 int64在我的平台上 我可以用吗 lt gt and 运算符来比较值 我不想知道两个时间值之间的差异 代码只会在 Windows 上运行 所以我不关心可移植性 以这种方式比
  • 如何使用Python脚本控制LabView VI前面板开关(开/关、条调节器)?

    我有一个LabView前面板控制硬件的开关和传感器电压调节器 需要使用 Python 脚本来控制它们 我对此了解不多LabView 请解释如何做到这一点 我在 LabVIEW 讨论板上找到了一份参考资料 该参考资料成功地this 它使用以下
  • 如何在 C++ 中将窗口的屏幕截图作为位图对象获取?

    如何在 C 中将窗口的屏幕截图作为位图对象获取 假设我已经有了窗口句柄 我还想知道是否可以在最小化状态下获取窗口的屏幕截图 这里的 C 是指 VC 以及与 Windows XP win32 相关的所有库 你应该调用 PrintWindow
  • RubyMine 代码自动完成

    我即将习惯在 Android Studio 中使用 Java 最棒的是一切都被强烈声明 因此 当我输入 MyClass someme 时 IDE 会为我提供高级代码自动完成功能 发展是迅速而令人愉快的 但后来我想学习 RubyOnRails
  • 如何在 Bash 中读取文件或标准输入

    以下 Perl 脚本 my pl 可以从命令行参数中的文件或从标准输入 标准输入 while lt gt print perl my pl将从标准输入读取 而perl my pl a txt将从中读取a txt 这非常方便 Bash 中有类
  • 如何将 2 个 Excel 文件合并为一个具有不同工作表的 Excel 文件?

    我有 2 个 Excel 文件 我想将它们合并为 1 个具有单独工作表的文件 我尝试与 Microsoft Office Interop Excel 进行合并 但我不明白如何使用它 对于叶海亚 这里是获取范围的方法 我想将它们与不同的文件合
  • 如何为 cout 编写一个允许表达语法的函数包装器?

    我想包起来std cout用于格式化 如下所示 mycout what type x optional args do some formatting on x first std cout lt lt x 并且仍然能够使用表达语法 例如
  • 样式和主题的背景问题

    在 attrs 我有
  • 强制方向为纵向模式

    我的所有应用程序都处于纵向模式 但我有一个横向模式的视图控制器作为图像库 在 项目摘要 选项卡上启用 LandscapeLeft 模式 因此我必须在视图控制器的其余部分中以这种方式禁用旋转 但图像库的 VC 中除外 我想保持旋转为纵向模式
  • 我可以仅使用 twiml bin 将短信转发到电子邮件吗?

    非常清楚如何使用 twilio 将 SMS 转发到电子邮件地址 他们有一个使用托管在第三方服务器上的 php 代码执行此操作的很好的示例 但是 我想仅使用 twiml 应用程序将短信转发到电子邮件地址 而不使用其他第三方请求 代码 我尝试使
  • Spring boot Tomcat – 启用/禁用目录列表

    I have spring boot应用程序和我正在使用embedded tomcat作为网络服务器 我在列出目录时遇到问题 我现在就想怎样才能enable or disable listing directories在嵌入式tomcat中
  • 更改 JPanel Graphics g 颜色绘制线

    我有一个类似于绘画的程序 而且我正在尝试实现更改笔颜色 但是当我更改颜色时 当前绘制的所有内容都会更改为红色 例如在我的程序中 我怎样才能使其不会将当前绘制的所有内容重新绘制为当前颜色改变颜色 下面的代码将编译并运行 JPanel 绘图区域
  • 在 spring 中加载属性文件

    我们的一个团队已经以这种方式实现了加载属性 请参见下面的伪代码 并建议这种方法是正确的 因为使用这种方法的客户端应用程序可以自由地将属性保留在任何文件中 与广泛使用的 propertyplaceholderconfigurer 相反 应用程
  • 将数组转换为 JSON

    我有一个数组var cars 2 3 其中包含一些整数 我已经向数组添加了一些值 但现在需要通过 jQuery 将此数组发送到页面 get方法 如何将其转换为 JSON 对象进行发送 向后兼容的脚本 https github com dou
  • 解析性能(If、TryParse、Try-Catch)

    我了解很多处理解析文本以获取信息的不同方法 例如 对于解析整数 可以预期什么样的性能 我想知道是否有人知道这方面的任何好的统计数据 我正在从测试过这个的人那里寻找一些真实的数字 其中哪一个在哪些情况下提供最佳性能 Parse Crash i