泛型方法中的原始类型转换,无需装箱

2023-12-04

在对我们的一个应用程序进行一些分析时,我发现了以下代码:

public TOut GetValue<TIn, TOut>(Func<TIn> getter)
{
    var value = getter();

    // Do some stuff with the value

    return (TOut)Convert.ChangeType(value, typeof(TOut));
}

TIn and TOut可以是 int、double 或 string。

由于使用 int 或 double 时的装箱,这在分析会话中显示为堆分配的重要来源。输入值Convert.ChangeType被装箱是因为该方法需要一个对象,并且返回值也出于同样的原因被装箱。

我正在尝试优化此代码,因为此方法用于高吞吐量服务,而这种分配是禁止的。理想情况下,我会将该方法重写为非通用方法,但该 API 被各​​个团队广泛使用,这种规模的重构将需要数月时间。与此同时,我正在尝试缓解这个问题,并找到一种在不更改 API 合约的情况下改善情况的方法。然而我已经为此苦苦挣扎了一段时间,尚未找到解决方案。

您是否知道一种方法,即使是丑陋的方法,在给定方法契约的情况下处理 int -> double 和 double -> int 转换而无需装箱?请注意,我无法更改参数,但我可以添加通用约束(例如where TIn : IConvertible,但这对我没有多大帮助)。


如果您只需要专门化几个转换,我认为以下方法可行并且不会产生任何每次调用分配:

    private static int FromDouble(double other)
    {
        return (int)other;
    }
    private static double FromInt(int other)
    {
        return (double)other;
    }

    private static Func<double, int> di = FromDouble;
    private static Func<int, double> id = FromInt;
    public TOut GetValue<TIn, TOut>(Func<TIn> getter)
    {
        var value = getter();

        // Do some stuff with the value

        if (typeof(TIn) == typeof(int) && typeof(TOut) == typeof(double))
        {
            var gf = (Func<TIn, TOut>)(object)id;
            return gf(value);
        }else if (typeof(TIn) == typeof(double) && typeof(TOut) == typeof(int))
        {
            var gf = (Func<TIn, TOut>)(object)di;
            return gf(value);
        }

        return (TOut)Convert.ChangeType(value, typeof(TOut));
    }

当然,还可以对此进行一些进一步的调整。

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

泛型方法中的原始类型转换,无需装箱 的相关文章

  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似

随机推荐

  • 使用ajax插入查询而不重新加载整个页面

    我想通过 AJAX 插入数据 无需重新加载页面 我尝试过 但它没有显示数据 也没有重新加载页面 我有一个文件首先 php 其中存在表单 AJAX 代码和第一次调用 php查询将在哪里执行 My 首先 php html形式 是
  • JavaFX 11 不可编辑的 ComboBox 无法正确显示组合项列表之外的值

    我有麻烦JavaFX 11ComboBox 看来在 JavaFX 8 中它工作正常 For 不可编辑的组合 即在按钮单元格中显示所选值 不在可编辑文本框中 如果新值是 则不显示任何值 按钮单元格可能被视为 空 不包含在组合的项目列表中 只有
  • 播放验证 - 具有特定字段错误的自定义表单字段验证

    case class Address address1 String city String state String postal String country String Form mapping mapping address1 g
  • NSDateFormatter setDateFormat 的序号月日后缀选项

    我使用 NSDateFormatter 的什么 setDateFormat 选项来获取月份的序数后缀 例如下面的代码片段当前生成 8 月 15 日星期六下午 3 11 我必须改变什么才能得到 8 月 15 日星期六下午 3 11th NSD
  • jQuery animate() 元素的单个队列

    默认情况下 为 animate 创建的 jQuery 队列是按每个元素完成的 我想知道是否有一种方法可以为使用 animate 完成的所有动画创建单个队列 IE 一次只能发生一个动画 您可以使用队列在一个元素上使用自己的自定义队列来完成此操
  • R 中非标准日期因子的新列

    我有一个带有奇怪格式的日期列的数据框 我想创建一个列 仅显示原始日期列中的年份 但我很难想出一种方法来执行此操作 因为当前日期列被视为一个因素 任何有关如何有效地做到这一点的建议将不胜感激 Example从 开始 org lt c a b
  • Windows 通用应用程序 - 从 Azure 容器下载所有 Blob

    我有一个通用 Windows 应用程序 我试图在应用程序启动时从天蓝色容器下载所有 blob 这是我的代码 public MainPage this InitializeComponent downloadblobs public asyn
  • WinDbg:使用 .if 中的条件命令

    WinDbg 有 if 语句用于条件执行命令 if Condition Commands else Commands 对于条件 无法使用 WinDbg 命令 是否有任何间接方式使用条件命令 例如通过伪寄存器 要完成的示例任务 如果日志文件已
  • 如何使用 xml.etree.ElementTree 编写 XML 声明

    我正在使用 Python 生成 XML 文档ElementTree 但是tostring函数不包括XML声明当转换为明文时 from xml etree ElementTree import Element tostring documen
  • 从没有列名的查询中选择数据

    我在 VBA 中使用 SQL 来填充电子表格 但当我这样做时 我会获取包括列标题的数据 我试图找到只提取信息而不提取列名称的方法 例如 id name job 0 Tom Repair 1 Bob Tech 相反我想要 0 Tom Repa
  • pip install pygame - 找不到 SDL.h 文件

    macOS 塞拉利昂 fun python pip version pip 9 0 1 from Library Frameworks Python framework Versions 3 5 lib python3 5 site pac
  • 正则表达式中对 \K 的支持

    The K转义序列将匹配的开头重置为当前位置 令牌列表 这只影响报告为完全匹配的内容 支持哪些环境 语言 版本 K 保留 在其正则表达式引擎中 以及需要哪些库 如果有 才能在模式中使用此功能 The K多种引擎 语言或工具支持转义序列 例如
  • XSL:`xsl:template` 的 `match="/"` 的含义

    我刚刚学习 XML 以及如何使用 XSL 文件 在 XSL 文件中我发现了以下术语 xsl template match 这代表什么 我可以用什么来代替 我可以写吗table或任何其他 HTML 标签来代替 的价值match的属性
  • 什么情况下HTTP_REFERER会为空

    我知道有可能得到一个空的 HTTP REFERER 什么情况下会出现这种情况 如果我得到一个空的 是否总是意味着用户更改了它 获取空值与获取空值相同吗 在什么情况下我也会得到这个 当最终用户 在浏览器地址栏中输入站点 URL 通过浏览器维护
  • 在 C# 中序列化数组列表

    我有一个包含许多标准字段和一个数组列表的类 有没有办法使用 XmlSerializer 序列化该类 到目前为止的尝试会导致一条错误消息 Unhandled Exception System InvalidOperationException
  • 使用 .NET 反应式扩展定期调度 IEnumerable

    比如说我有一个可枚举的 dim e Enumerable Range 0 1024 我希望能够做到 dim o e ToObservable Timespan FromSeconds 1 这样可观察对象每秒都会生成值 直到枚举完毕 我想不出
  • PostgreSQL 中使用“类似”的查询性能

    我需要根据特定列中的某些值从表中检索某些行 名为columnX在示例中 select from tableName where columnX similar to A B C 1 2 3 So if columnX至少包含指定值之一 A
  • 可执行路径指向错误的位置,如何更新

    我最近使用 npm 更新了一个 nodejs 可执行文件 现在该可执行文件指向错误的位置 当我在终端中运行which命令时 它指向旧的不存在的位置 如何更新可执行路径或快捷方式 我不是一个 Unix 人 所以不确定它在哪里设置 我不一定需要
  • 在管理员接受其域的应用程序市场范围后,我们是否需要等待以避免同意屏幕?

    我们正在将我们的应用程序集成到新的 Google Marketplace 中 我们在开发者控制台中的市场配置没问题 我们的 oauth2 sso 流程正常 范围与控制台中的设置匹配 身份验证参数正常 所有用户在通过导航栏访问我们的应用程序时
  • 泛型方法中的原始类型转换,无需装箱

    在对我们的一个应用程序进行一些分析时 我发现了以下代码 public TOut GetValue