首页 > 其他分享 >ILRuntime编码中如何注意性能问题

ILRuntime编码中如何注意性能问题

时间:2024-02-02 09:33:46浏览次数:22  
标签:ILRuntime 编码 性能 properties 频繁 避免 内存 操作 public

一、避免频繁的反射操作

在使用ILRuntime时,我们需要频繁地进行反射操作,例如获取类型、获取方法、获取属性等等。反射操作是非常耗费性能的,所以我们需要尽可能地避免频繁的反射操作。

例如,我们需要获取一个类型的所有属性,我们可以使用以下代码:

PropertyInfo[] properties = typeof(MyClass).GetProperties();

 对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

这样的代码会频繁地进行反射操作,如果我们需要频繁地获取类型的属性,将会产生很大的性能开销。我们可以将获取属性的代码封装成一个方法,并将获取到的属性缓存起来。这样,在下次需要获取属性时,我们可以先从缓存中查找,避免频繁的反射操作。

public static class ReflectionCache
{
    private static Dictionary<Type, PropertyInfo[]> propertyCache = new Dictionary<Type, PropertyInfo[]>();

    public static PropertyInfo[] GetProperties(Type type)
    {
        if (propertyCache.TryGetValue(type, out PropertyInfo[] properties))
        {
            return properties;
        }
        else
        {
            properties = type.GetProperties();
            propertyCache[type] = properties;
            return properties;
        }
    }
}

 

我们可以使用以上代码来获取类型的属性,这样就可以避免频繁的反射操作。

二、避免频繁的装箱和拆箱操作

在使用ILRuntime时,我们需要频繁地进行装箱和拆箱操作。装箱和拆箱操作是非常耗费性能的,所以我们需要尽可能地避免频繁的装箱和拆箱操作。

装箱和拆箱操作指的是将值类型转换为引用类型和将引用类型转换为值类型的操作。例如,将int类型的变量转换为object类型的变量就是一次装箱操作,将object类型的变量转换为int类型的变量就是一次拆箱操作。

装箱和拆箱操作会产生额外的内存开销和GC压力,所以我们需要尽可能地避免频繁的装箱和拆箱操作。例如,我们可以使用泛型来避免装箱和拆箱操作。

public static class ReflectionCache
{
    private static Dictionary<Type, PropertyInfo[]> propertyCache = new Dictionary<Type, PropertyInfo[]>();

    public static PropertyInfo[] GetProperties(Type type)
    {
        if (propertyCache.TryGetValue(type, out PropertyInfo[] properties))
        {
            return properties;
        }
        else
        {
            properties = type.GetProperties();
            propertyCache[type] = properties;
            return properties;
        }
    }
}

 

使用泛型可以避免频繁的装箱和拆箱操作,提高性能。

三、避免频繁的委托操作

在使用ILRuntime时,我们需要频繁地使用委托来实现函数回调。委托操作是非常耗费性能的,所以我们需要尽可能地避免频繁的委托操作。

委托操作指的是将一个方法封装成一个委托对象,并将委托对象传递给其他方法进行回调。委托操作会产生额外的内存开销和GC压力,所以我们需要尽可能地避免频繁的委托操作。

例如,我们可以使用事件来避免频繁的委托操作。

public class MyEventClass
{
    public event Action OnEvent;

    public void DoSomething()
    {
        // do something
        OnEvent?.Invoke();
    }
}

 

使用事件可以避免频繁的委托操作,提高性能。

四、避免频繁的字符串操作

在使用ILRuntime时,我们需要频繁地进行字符串操作。字符串操作是非常耗费性能的,所以我们需要尽可能地避免频��的字符串操作。

字符串操作指的是对字符串进行拼接、截取、替换等操作。字符串操作会产生额外的内存开销和GC压力,所以我们需要尽可能地避免频繁的字符串操作。

例如,我们可以使用StringBuilder来避免频繁的字符串操作。

StringBuilder sb = new StringBuilder();
sb.Append("Hello");
sb.Append(" ");
sb.Append("World");
string result = sb.ToString();

 

使用StringBuilder可以避免频繁的字符串操作,提高性能。

五、避免频繁的内存分配

在使用ILRuntime时,我们需要频繁地进行内存分配。内存分配是非常耗费性能的,所以我们需要尽可能地避免频繁的内存分配。

内存分配指的是在堆上分配一段内存空间,并返回该内存空间的引用。内存分配会产生额外的内存开销和GC压力,所以我们需要尽可能地避免频繁的内存分配。

例如,我们可以使用对象池来避免频繁的内存分配。

public class MyObject
{
    // fields
}

public class ObjectPool<T> where T : new()
{
    private Stack<T> pool = new Stack<T>();

    public T GetObject()
    {
        if (pool.Count > 0)
        {
            return pool.Pop();
        }
        else
        {
            return new T();
        }
    }

    public void RecycleObject(T obj)
    {
        pool.Push(obj);
    }
}

 

使用对象池可以避免频繁的内存分配,提高性能。

标签:ILRuntime,编码,性能,properties,频繁,避免,内存,操作,public
From: https://www.cnblogs.com/bycw/p/18002566

相关文章

  • 响应式的 WebFlux 框架更优雅,性能更强!
    spring-webflux是spring在5.0版本后提供的一套响应式编程风格的web开发框架。这个框架包含了spring-framework和springmvc,它可以运行在Netty、Undertow以及3.1版本以上的Serlvet容器上。你可以在项目中同时使用spring-webmvc和spring-webflux,或者只用其中一个来开发web应用。所谓......
  • 提升网站性能的秘诀:为什么Nginx是高效服务器的代名词?
    在这个信息爆炸的时代,每当你在浏览器中输入一个网址,背后都有一个强大的服务器在默默地工作。而在这些服务器中,有一个名字你可能听说过无数次——Nginx。今天,就让我们一起探索这个神奇的工具。一、Nginx是什么Nginx(发音为“enginex”)是一个开源的高性能HTTP和反向代理服务器。它由......
  • C# 自己写的编码机制,将任意字节数组和可打印中文字符串相互转换
    正常情况下咱们可以用Base64将字节数组转成可打印字符串,但是有的时候咱们需要编码后具有一定的保密性,很明显Base64就不适用了,网上有个与熊论道就挺有意思的,于是我也研究学习了下,自己实现了一个将字节流编码为可打印(可拷贝)中文字符串的功能,反之,也能将中文字符串解码为原始字节流......
  • Klocwork 2023.4发布:问题匹配算法升级,编码标准全面支持!
    Klocwork2023.4的新增功能Klocwork2023.4改进了问题匹配的算法,为桌面端和CI集成构建之间的结果提供了更大的一致性,以及连续构建之间的问题匹配。Klocwork的最新版本还改进了C/C++语言的分析引擎,减少了误报/漏报,跨过程跟踪数组索引中的值和具有常量表达式的值。此外,还对IDE插......
  • 长连接网关技术专题(九):去哪儿网酒店高性能业务网关技术实践
    本文由去哪儿网技术团队田文琦分享,本文有修订和改动。1、引言本文针对去哪儿网酒店业务网关的吞吐率下降、响应时间上升等问题,进行全流程异步化、服务编排方案等措施,进行了高性能网关的技术优化实践。技术交流:-移动端IM开发入门文章:《新手入门一篇就够:从零开发移动端IM》......
  • CPU性能跑分工具 SPEC2006
    一.工具介绍 前言   SPEC2006benchmark是SPEC新一代的行业标准化的CPU测试基准套件。重点测试系统的处理器,内存子系统和编译器。这个基准测试套件包括的SPECint基准和SPECfp基准。主要依赖于gcc,g++,gfortran并与其 版本息息相关。其中SPECint2006基准包含12个不同......
  • WPF性能优化:形状(Shape)、几何图形(Geometry)和图画(Drawing)的使用
    在用户界面技术中,绘图是一个绕不开的话题。WPF提供了多种可根据应用程序要求进行优化的2D图形和图像的处理功能,包括画刷(Brush)、形状(Shape)、几何图形(Geometry)、图画(Drawing)和变换(Transform)等。其中形状(Shape)、几何图形(Geometry)和图画(Drawing)承担了基础的绘图功能,形......
  • 分析HarmonyOS应用/服务的CPU活动性能
    CPUProfiler性能分析是用来分析CPU性能瓶颈的工具,可以实时查看应用/服务的CPU使用率和线程活动,也可以查看记录的方法跟踪数据、方法采样数据和系统跟踪数据的详情。基于CPU性能分析,您可以了解在一段时间内执行了哪些方法,以及每个方法在其执行期间消耗的CPU资源,可以有针对性的优......
  • 性能测试学习笔记
    一、性能测试的基本操作1、概念:体现当前服务器到底能不能带动开发的软件2、服务器优化:升级配置(服务器升级内容、cpu),横向扩容(多台服务器)3、并发:  二、性能测试的调优(具体怎么调,由开发/运维去做),测试指导开发问题发生的位置 ......
  • oracle数据表中栏位里的汉字显示未utf-8编码
    问题:解决使用System.Text.Json.JsonSerializer序列化dto为字符串时,要传入如下配置 //解决中文存入数据库后变成UTF-8编码的问题      privateJsonSerializerOptions_jsonSerializerOptions=newJsonSerializerOptions      {         Enc......