我们公司有一个Unity原生开发语言C#写的项目,目前已经在安卓测试过多次,上架IOS在考虑热更,所以对ILRuntim进行性能测试,在测试过程中已经按照官方文档进行了CLR绑定和生成Release的Dll,并且在非Editor环境下测试。

我的测试环境:ILRuntime 1.6.3 ,MuMu模拟器和华为手机

50万次的加法运算

ILRuntime使用全局变量:UnitTest_Performance50万 Elapsed time:1050ms, result = 445698416 ,Tick:10527445

ILRuntime使用局部变量:UnitTest_Performance50万 Elapsed time:534ms, result = 445698416 ,Tick:5436060

Unity原生代码:mono UnitTest_Performance50万 Elapsed time:1ms, result = 445698416 ,Tick:19900

xlua中lua:[10:42:43.8636]LUA: cost: 4.00ms

C#测试代码

 public static void UnitTest_Performance3()
{
var before = DateTime.Now.Ticks;
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
int cnt = 0;
for (int i = 0; i < 500000; i++)
{
cnt += i;
}
sw.Stop();
var tick_diff = DateTime.Now.Ticks - before;
Debug.Log(string.Format("UnitTest_Performance50万 Elapsed time:{0:0}ms, result = {1} ,Tick:{2}", sw.ElapsedMilliseconds, cnt,tick_diff));
}

Lua测试代码

local begin = os.clock()
local cnt = 0;
for i = 1, 500000 do
cnt = cnt + i;
end
local diff = os.clock() - begin;
print(string.format("cost:%.2f ms", diff*1000))

从测试结果可以看到在Lua做加法运算的性能会比ILRuntime中好一百倍左右,对于需要大量运算的确实如ILRuntime的文档所以不应该放热更代码中

为什么不测试热更调主工程?

在这个项目中,从热更调用主工程代码,相对比较少,大部分都是在热更工程中使用计算,比如对象管理,战斗部分,玩法逻辑。

从ILRuntime的文档中提到跨域调用会比Lua快很多

空Update也耗时

对于MonoBehaviour中的空Update,当执行上千次时,耗时在0.1ms,所以要去掉空内容的Update

建议

栈和堆差别非常大

上面局部变量和全局变量的耗时差别很大,是因为局部变量是存储在栈中,而全局变量是存储在堆中,一定要注意在进行遍历一个列表时,在方法内先使用local xx = 全局变量,这样对于性能的提升是非常有效的

逻辑运算问题会放大数百倍

如果项目计划使用ILRuntime热更,强烈建议在项目初期就接入,这样能及早发现逻辑代码效率问题,及早解决掉。

一定要仔细阅读官方的文档,避免踩到雷区,比如foreach会产生GC Allow,热更代码中避免频繁大量的计算和空函数调用,对于有很多的空Update也需要去掉

不要使用foreach

在每秒执行的update中使用for会比foreach性能好很多

ILRuntime性能测试的更多相关文章

  1. Ignite性能测试以及对redis的对比

    测试方法 为了对Ignite做一个基本了解,做了一个性能测试,测试方法也比较简单主要是针对client模式,因为这种方法和使用redis的方式特别像.测试方法很简单主要是下面几点: 不作参数优化,默认 ...

  2. 性能测试工具 wrk 安装与使用

    介绍 今天给大家介绍一款开源的性能测试工具 wrk,简单易用,没有Load Runner那么复杂,他和 apache benchmark(ab)同属于性能测试工具,但是比 ab 功能更加强大,并且可以 ...

  3. .NET Core性能测试组件BenchmarkDotNet 支持.NET Framework Mono

    .NET Core 超强性能测试组件BenchmarkDotNet 支持Full .NET Framework, .NET Core (RTM), Mono. BenchmarkDotNet支持 C# ...

  4. C#中实现并发的几种方法的性能测试

    C#中实现并发的几种方法的性能测试 0x00 起因 去年写的一个程序因为需要在局域网发送消息支持一些命令和简单数据的传输,所以写了一个C/S的通信模块.当时的做法很简单,服务端等待链接,有用户接入后开 ...

  5. 「视频直播技术详解」系列之七:直播云 SDK 性能测试模型

    ​关于直播的技术文章不少,成体系的不多.我们将用七篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面.深入地了解视频直播技术,更好地技术选型. 本系列文章大纲如下: ...

  6. PostgreSql性能测试

    # PostgreSql性能测试 ## 1. 环境+ 版本:9.4.9+ 系统:OS X 10.11.5+ CPU:Core i5 2.7G+ 内存:16G+ 硬盘:256G SSD ## 2. 测试 ...

  7. Web系统性能测试术语简介

    并发用户 并发一般分为两种情况.一种是严格意义上的并发,即所有的用户在同一时刻做同一件事情或者操作.这种操作一般指做同一类型的业务,比如在信用卡审批业务中,一定数目的用户在同一时刻对已经完成的审批业务 ...

  8. Web前端性能测试-性能测试知多少---深入分析前端站点的性能

    针对目前接手的web前端的性能,一时间不知道从什么地方入手,然后经过查找资料,发现其实还是蛮简单的. 前端性能测试对象: HTML.CSS.JS.AJAX等前端技术开发的Web页面 影响用户浏览网页速 ...

  9. 基于webdriver的jmeter性能测试-通过jmeter实现jar录制脚本的性能测试

    续接--基于webdriver的jmeter性能测试-Eclipse+Selenium+JUnit生成jar包 在进行测试前先将用于支持selenium录制脚本运行所需的类包jar文件放到jmeter ...

  10. Probe在性能测试中的使用方式简介

    简介: Lambda Probe(以前称为Tomcat Probe)是一款实时监控和管理的Apache Tomcat实例的基本工具. Lambda Probe 是基于 Web + AJAX 的强大的免 ...

随机推荐

  1. flask 上传文件,视图

    记得有template ''' 导入flask类.该类的实例将会成为我们的wsgi应用 __name__是一个适用于大多数情况的快捷方式,有了这个参数,flask才能知道在那里找到模板和静态文件等东西 ...

  2. 手把手教你在 Windows 环境中搭建 MQTT 服务器

    前言 前些天要对接一家硬件商的设备数据,对方使用的 MQTT 协议点对点透传,所以又赶紧搭建 MQTT 服务器,写 .NET 程序接收数据等等,今天分享一下如何搭建 MQTT 服务器. MQTT 协议 ...

  3. cookie与session简介 django操作cookie django操作session

    目录 cookie与session简介 早期cookies 随机字符串解决cookies安全问题 禁止浏览器保存cookies django操作cookie set_cookie set_signed ...

  4. 01-什么是 Java:Java 初学者指南

    什么是Java? Java 是一种用于互联网分布式环境的面向对象编程语言.它是一种高级语言,也易于阅读和理解.有了它,开发人员可以"编写一次,随处运行"(WORA),这意味着编译后 ...

  5. 0x61 图论-最短路

    B题 Telephone Lines https://ac.nowcoder.com/acm/contest/1055/B 中文题面:https://www.luogu.com.cn/problem/ ...

  6. Educational Codeforces Round 93 (Rated for Div. 2)

    Educational Codeforces Round 93 (Rated for Div. 2) A. Bad Triangle input 3 7 4 6 11 11 15 18 20 4 10 ...

  7. 嵌入式Linux必读经典书籍(含下载方式)

    最近,在知乎看到一个问题,"嵌入式Linux有哪些好书推荐".我读研期间也喜欢收藏一些书籍,每次看到京东有活动,总是忍不住想买一些书籍回来. 随着时间越来越久,我买的书越来越多,但 ...

  8. BOM概述

  9. 【C++】类成员冒号初始化以及构造函数内赋值

    From:https://blog.csdn.net/zj510/article/details/8135556 通常我们对类成员进行"初始化"有两种方式: 1. 构造函数后面跟冒 ...

  10. NSSCTF Round#11 Basic 密码个人赛复盘

    [NSSRound#11 Basic]ez_enc ABAABBBAABABAABBABABAABBABAAAABBABABABAAABAAABBAABBBBABBABBABBABABABAABBAA ...