
c#
文章平均质量分 88
RuntimeCube
这个作者很懒,什么都没留下…
展开
-
[C#] Foreach 循环还会产生垃圾吗?
虽然所有其他收集类型都没有改变它们产生的垃圾量,但至少它们使用的垃圾量都不比 Unity 5.2 中的垃圾量多。Dictionary、HashSet、LinkedList、Queue 和 Stack 现在在第一个循环上创建相同的 8 或 16 字节更少的垃圾,并在之后的任何循环上创建零垃圾。一年前,我写了一篇文章,标题为使用 Unity 5.2 进行 Foreach 循环创建垃圾,并使用各种集合测试了 foreach:列表、字典、数组等。所有代码和运行它的步骤仍然适用。翻译 2024-04-23 15:58:00 · 252 阅读 · 0 评论 -
[C#] C# String.Format() 和 StringBuilder
这很重要的原因是,在内部,String.Format() 实际上创建了一个 StringBuilder 并调用 StringBuilder.AppendFormat()!正如您所看到的,了解何时使用 String.Format 以及何时使用 StringBuilder.AppendFormat() 非常重要。而且,删除对 String.Format 的调用还可以提高性能。如果您试图避免通过使用 String.Format() 连接字符串来创建 StringBuilder,了解这一点也很重要。翻译 2024-04-21 21:08:47 · 353 阅读 · 0 评论 -
[C#] 何时在 .NET Core 中使用 String 与 StringBuilder
在 .NET Core 中处理字符串时,您会经常使用的两个流行类是 String 和 StringBuilder 类。在使用这两个类构建最小化分配且高性能的应用程序时,您应该了解最佳实践。本文讨论在 C# 中使用字符串时可以遵循的最佳实践。翻译 2024-04-21 19:56:10 · 254 阅读 · 0 评论 -
[C#] 从 Array 数据创建 ReadOnlySequence
在这篇文章中,我们进行了理论练习,并进一步了解了 ReadOnlySequence 类型。我保留对我的“SequenceReader 简介”博文中评论的最初回答。我认为我所展示的代码对于所提出的实际问题来说并不是一个明智的选择。然而,我喜欢这样的问题,因为它让我意识到,我实际上并没有考虑过 ReadOnlySequence 是如何创建的。通过小样本的调查,我更多地了解了这种类型的行为方式,我认为这是值得投入的时间。我希望您发现阅读这篇文章同样有用或至少有趣!翻译 2024-04-21 15:38:20 · 249 阅读 · 0 评论 -
[C#] SequenceReader 简介
可能值得首先解决这个问题,因为这是 .NET Core 中相当新的类型,并且您会遇到它的情况有限。不久前,添加了 Span 和 Memory 类型。它们都支持通过一致的 API 处理各种类型的连续内存区域。从那时起,许多新的构造都建立在这些类型提供的基础上。System.IO.Pipelines 就是一个这样的例子,它是一种用于处理 IO 的高性能 API。传统上,许多 IO 操作都使用流。流的一个问题是,它们让你负责管理缓冲区和在缓冲区之间复制数据。翻译 2024-04-21 10:20:32 · 408 阅读 · 0 评论 -
[C#] C# 索引和范围运算符解释
在这篇文章中,我们将最全面地揭开 C# 索引 ^ 和范围 … 运算符的神秘面纱。翻译 2024-04-17 00:22:25 · 491 阅读 · 0 评论 -
[C#] .NET 中的 Span、Memory、ReadOnlySequence
在 .NET 领域,一个关键方面是有效的数据操作。当涉及到内存管理时,这种能力更加重要。Span、Memory 和 ReadOnlySequence 结构提供了用于优化数据管理的高级工具。这些结构不仅提供了高度的控制性和灵活性,而且还大大提高了运营效率。翻译 2024-04-15 08:08:26 · 688 阅读 · 0 评论 -
[C#] 在 C# 中使用 Span<T> 和 Memory<T> 编写高性能代码
Span(之前称为 Slice)是 C# 7.2 和 .NET Core 2.1 中引入的一种值类型,开销几乎为零。Span 类型表示驻留在托管堆、栈甚至非托管内存中的连续内存块。如果创建基本类型的数组,它将在栈上分配,并且不需要垃圾回收来管理其生命周期。Span 能够指向分配在栈或堆上的一块内存。但是,由于 Span 被定义为引用结构,因此它应该仅驻留在堆栈上。值类型低或零开销高性能提供内存和类型安全ArraysStringsArraysPointers。翻译 2024-04-14 01:15:43 · 1426 阅读 · 0 评论 -
[C#] 使用 Span<T> 结构编写高性能 C# 简介
今天我们来谈谈 Span,它已经被讨论了好几年了,因为它是随 C#7.2 引入的,并在 .NET Core 2.1 及更高版本的运行时中得到支持。在本文中,我们将通过一些示例来介绍如何使用 Span ,并讨论为什么在编写下一行代码时应该考虑使用它。翻译 2024-04-10 23:37:58 · 1277 阅读 · 0 评论 -
[Unity] UniTask v2 — Unity 的零分配async / await,具有异步 LINQ [2]
我之前发布过UniTask,这是 Unity 的一个新的异步/等待库,现在我重写了所有代码并发布了新的UniTask。在 UniTask v2 中,由于对代码进行了彻底重写,几乎所有内容都是零分配的(技术细节将在后面介绍)。翻译 2024-04-08 12:50:43 · 1060 阅读 · 0 评论 -
[Unity] 为什么空合并运算符 (??, ??=) 在 Unity 中是邪恶的?
我最近在 C# 中遇到了空合并运算符。如果您不熟悉它们,以下是它们的工作原理。??如果不为空,则返回左侧,否则返回右侧。如果 myList 为 null,此行会将 processList 设置为新列表。??= 只是??的赋值变体。仅当 myList 为空时,此行才会将其设置为新列表。翻译 2024-04-02 22:21:38 · 171 阅读 · 0 评论 -
[多线程] 不惜一切代价避免 GetAwaiter().GetResult()
当您需要等待Task时,您是否在同步方法中使用“.GetAwaiter().GetResult()”而不是“.Result”和“.Wait()”?你正在做比较正确的事,但前提是您无法改变该方法!翻译 2024-04-01 22:35:01 · 1012 阅读 · 0 评论 -
[C#] 每个 C# 开发人员都应该知道的事情#1:hash codes (哈希码)
译者总结:HashCode是为了给这个对象一个独一无二的id。让对象在哈希表内均匀的分布,使查找时,速度更快作为一名 C# 开发人员,显然需要掌握很多技能才能发挥作用:语言语法、框架类、第三方库、数据库、正则表达式、HTTP 协议等。翻译 2024-03-31 15:50:47 · 724 阅读 · 0 评论 -
[多线程] 在异步编程中理解和使用ConfigureAwait
ConfigureAwait 是一种可用于任何 Task 或 Task 对象的方法,用于配置等待该任务时await 关键字的行为方式。它采用一个名为 continueOnCapturedContext 的布尔参数,该参数确定等待之后的延续是否应在与启动任务的上下文相同的上下文中运行。什么是上下文?上下文是一个抽象,表示与执行线程关联的某种状态或环境。例如,在 UI 应用程序中,上下文通常是 UI 线程及其关联的消息循环。在 ASP.NET 应用程序中,上下文是 HTTP 请求及其关联状态。翻译 2024-03-30 22:29:41 · 202 阅读 · 0 评论 -
[多线程] C#:为什么应该在库代码中使用ConfigureAwait(false)
Async/await 关键字提高了代码的可读性和程序员的工作效率,因为代码类似于同步代码,并且易于理解,这要归功于编译器处理了异步编程中最困难的部分。现在,我们将分析为什么 UI 应用程序中会发生死锁(而不是大多数控制台应用程序中),以及为什么ConfigureAwait(false) 可以解决这个问题。如果这是在控制台应用程序中执行,大多数时候我们的代码将按预期运行(不一定总是)。总之,在库代码中始终使用ConfigureAwait(false) 是一种很好的做法,可以防止出现不必要的问题。翻译 2024-03-30 13:14:57 · 188 阅读 · 0 评论 -
[C#] C# Tasks vs. Unity Jobs
两周前,我们针对 Unity 的新 C# 作业系统测试了 async 和 wait 关键字以及 C# Task 系统的性能。这测试了 Task 系统中异步和等待的常见组合,但没有直接针对 Unity 的 C# 作业系统测试任务系统。今天我们将对此进行测试,并在此过程中了解如何在没有 async 和 wait 关键字的情况下使用Task系统。翻译 2024-03-10 21:55:57 · 297 阅读 · 0 评论 -
[C#] Burst编译通用算法
许多算法被反复使用:搜索、排序、过滤等。C# 通过 LINQ 和 Array.Sort 等函数提供这些算法,但这些算法无法由 Burst 编译,因为不支持接口和委托。那么我们如何实现这些通用算法以避免一遍又一遍地重写它们呢?今天我们将探索一种解决这个问题的技术。请继续阅读以了解具体方法!翻译 2024-03-10 21:30:29 · 179 阅读 · 0 评论 -
[C#] LINQ 性能更新
为了与这些功能进行比较,测试包括完全“手动”版本和“正常”版本,该版本以更实用的方式使用相同的委托。现在,测试已更新为更加简单,并且更少依赖委托,以避免将测试框架的性能与正在测试的代码混淆。如果您想自己进行测试,只需将上述代码粘贴到 Unity 项目 “资产”(Assets)目录下的 TestScript.cs 文件中,并将其附加到新的空项目中的主摄像头游戏对象上即可。可用性完全是另一回事。今天,我们将使用 Unity 2018.1 和 IL2CPP 更新该文章的测试,看看 LINQ 最近的表现如何。翻译 2024-02-25 20:51:46 · 162 阅读 · 0 评论 -
[C#] LINQ 到底产生了多少垃圾?
考虑到这些信息,很容易建议不要逐帧使用 LINQ,因为在大多数游戏中,GC 分配即使不是完全禁止,通常也应该保持在最低限度。在最糟糕的情况下,OrderBy 的分配量高达 0.5 KB,而 ToDictionary 的情况也差不多糟糕,分配了 434 字节。其中 10 个函数分配了不止一次,而其余 7 个函数只分配了一次。对于今天的测试,我们将使用每种方法的一个重载,以保持事情简单明了。然后,只需在 CPU 使用情况剖析器的层次结构视图的 GC 分配列和内存剖析器的每帧 GC 分配中记录帧即可。翻译 2024-02-25 20:38:14 · 513 阅读 · 0 评论 -
[C#] LINQ 的CPU性能
如果您想自己尝试测试,只需将上述代码粘贴到 Unity 项目的 Assets 目录中的 TestScript.cs 文件中,并将其附加到新的空项目中的主相机游戏对象。这是可以预料的,因为他们通过了解问题的所有细节来“作弊”:元素类型、枚举类型以及每个元素要执行的函数。如果您发现带有 LINQ 查询的函数会减慢您的应用程序的速度,请考虑使用“手动”方法重写 LINQ 查询。我们将使用一个包含 1024 个元素的数组(全部为零),并在Where()中查找值1,并将Select中的每个元素加倍。翻译 2024-02-25 19:17:18 · 283 阅读 · 0 评论 -
[C#] 对象池产生的问题
很常见的是,有人问有关避免垃圾收集器的问题,但得到的答案却是“只需使用池”,就好像这立即完全解决了问题一样。虽然池通常会让垃圾收集器陷入困境,但它们也会带来一系列你必须处理的新问题。今天的文章将讨论其中的几个问题,以便您了解所涉及的权衡,并希望避免一些陷阱。翻译 2024-02-25 19:08:02 · 136 阅读 · 0 评论 -
[c#] Unity 如何禁用 GC
例如,如果我们在加载一个游戏关卡后开始使用 100 MB 的内存,并且我们知道在该关卡期间不会分配超过 100 MB 的内存,那么我们在任何可以使用的设备上都没有问题。但实际上,这些函数是 Unity 使用的现成 GC 的一部分,文件头中的最新日期是 2001 年,因此这种技术很可能会继续有效,直到 Unity 最终取代 GC。如果它不为零,则 GC 被禁用。对于游戏的帧速率关键部分禁用 GC 并在之后重新启用它(例如在加载屏幕上)可能是一个很大的好处,对于某些游戏来说是值得的,但应该非常小心地使用。翻译 2024-02-17 22:20:06 · 481 阅读 · 0 评论 -
[C#] 无装箱集合
在上周使用 List 等集合的技巧中,我们看到了结构类型有时是如何装箱的,从而导致 GC 分配。本周我们将了解如何避免装箱,并学习 .NET 集合类型用来实现这一点的一些巧妙技巧。翻译 2024-02-17 22:00:21 · 119 阅读 · 0 评论 -
[C#]C#中的迭代器, IEnumerable<T>和 IAsyncEnumerable<T>
长话短说 – Iterators (迭代器) – 允许您在返回 IEnumerable< T > 的函数中使用 Yield 关键字的东西 – 在幕后发挥作用,并且与返回 IEnumerable< T > 的非迭代器代码显着不同。翻译 2023-12-19 15:26:28 · 243 阅读 · 0 评论 -
[C#] .net 内存管理[9] - .NET 基础知识(1)
虽然我们只进入了第四章,但关于内存管理的各个方面,我们已经经历了相当长的旅程。对它们进行了一般性讨论,以便对该主题进行更具理论性的介绍。对 .NET 的具体引用非常罕见,毕竟这就是本书的主题。是时候改变这个频率了。从本章到本书结束,.NET 将一直伴随着我们。在本章中,我们将从更广泛的角度来看待它,我们将学习它背后的一些机制,并且我们将开始深入研究与它如何管理内存相关的主题。我强烈建议您在继续阅读本章之前先从前三章中获取知识,但将其视为一种可选方法。翻译 2023-07-08 14:06:16 · 469 阅读 · 0 评论 -
[HPC#] Hybridizer:GPU 上的高性能 C#
Hybridizer 是 Altimesh 的编译器,可让您通过 C# 代码或 .NET 程序集对 GPU 和其他加速器进行编程。Hybridizer 使用修饰符号来表达并行性,生成针对多核 CPU 和 GPU 优化的源代码或二进制文件。在这篇博文中,我们说明了 CUDA 目标。图 1 显示了 Hybridizer 编译流程。翻译 2023-07-06 11:09:00 · 1343 阅读 · 0 评论 -
[C#] .net 内存管理[8] - Linux 内存分析软件
Linux 的兴起和发展是开源社区无数贡献者的非凡创造。它并不是像 Windows 操作系统那样从一开始就由一家公司设计和实现。某些领域缺乏严格的标准化也就不足为奇了。其中一个方面是监控和跟踪我们特别感兴趣的应用程序。有许多可用的机制;其中一些正在慢慢失去人气,而另一些则刚刚开始流行。在这种情况下,Linux 中的监控基础设施变得不如 Windows 环境中的同质化。没有在所有发行版和系统内核中使用的广泛接受的诊断跟踪标准。将 CoreCLR 迁移到 Linux 环境时,必须决定使用什么机制。翻译 2023-06-26 09:30:30 · 427 阅读 · 0 评论 -
[C#] .net 内存管理[7] - windows内存分析软件
从适用于 Windows 10 的 Windows Performance Toolkit 版本中,有一种方法可以根据事件负载绘制自己的图表。换句话说,我们可以绘制 Y 轴来自选定事件字段之一的图表。X 轴将自动成为事件的时间。唯一的要求是所选字段具有整数值。不幸的是,这个限制对我们来说非常不利。垃圾收集器领域中的绝大多数有趣事件均以十六进制格式给出。这适用于各种大小、内存使用等等。这使得该机制目前没有多大用处,我们根本不会使用它。翻译 2023-06-25 17:06:46 · 2731 阅读 · 0 评论 -
[C#] .net 内存管理[6]
Windows监控和跟踪基础设施已经相当成熟,包括.NET环境的上下文。有两个主要可用组件:提供测量时间序列的指标驱动性能计数器和称为 Windows 事件跟踪 (ETW) 的事件驱动机制。这两个工具几乎涵盖了所有的监控和诊断需求。还有一个 Windows Management Instrumentation 机制,但它根本没有用于我们的目的(因为正如其名称所示,它更致力于管理和管理)。开发 .NET 时,所使用的诊断机制领域的选择是显而易见的。翻译 2023-06-24 19:21:43 · 502 阅读 · 0 评论 -
[C#] .net 内存管理[5]
Operating System(操作系统) 到目前为止,我们已经花了很多时间非常接近硬件。 我最初也答应看操作系统。 现在是这样做的最佳时机。 实际上,操作系统的设计者必须非常认真地对待所有先前仅简要介绍的事实。 正如您很快就会看到的那样,它仍然只是更广泛现实的一个片段。 由于操作系统和硬件架构的不同,物理内存限制从 2 GB 到 24 TB 不等。 现在典型的商品硬件配备了 4 到 8 GB 的内存。 如果给定的程序必须直接使用物理内存,它就需要管理它创建和删除的所有内存区域。 这样的内存管理逻翻译 2023-06-22 17:38:21 · 701 阅读 · 0 评论 -
[C#] .net 内存管理[4]
低级内存管理 要了解内存管理的工作原理,我们需要获得更广泛的背景知识。 在上一章中,我们了解了该主题的理论基础。 我们现在可以直接了解自动内存管理的细节、垃圾收集器的工作原理以及可能发生内存泄漏的位置。 但是,如果我们真的想“感受”这个话题,就值得多花一些时间来基本提醒这个话题的另一个方面。 这将使我们能够更好地理解垃圾收集器创建者在 .NET(以及其他托管运行时环境)中做出的各种设计决策。 这种机制的创造者并不是生活在真空中,而是必须适应存在的状态——支配计算机硬件和操作系统的限制和机制。 这就是我们翻译 2023-06-20 18:45:41 · 551 阅读 · 0 评论 -
[C#] .net 内存管理[3]
自动内存管理 为了克服手动内存管理的问题并为程序员提供更愉快的处理方式,已经提出了不同的自动内存管理方法。 有趣的是,与第二古老的高级编程语言 LISP 一样古老,大约在 1958 年提出(仅比 FORTRAN 晚几年),在该领域可以提供很多东西。 由于在很大程度上基于列表处理的主要函数式语言中 - 手动内存管理会非常不舒服。 函数式编程范式将程序视为对组合函数的评估,并强烈避免数据修改(突变)和副作用。 分配和释放内存是高度可变的并且有明显的副作用。 在函数式代码中以这种方式处理内存会使它充满命令式气翻译 2023-06-19 16:02:55 · 291 阅读 · 0 评论 -
[C#] .net 内存管理[2]
基本概念 让我们从一个简单但非常重要的问题开始。 如果 .NET 内存管理全部自动化,您什么时候应该关心它? 你应该关心吗? 正如您可能对我写了这样一本书所期望的那样——我强烈建议您记住每个开发人员处境中的内存。 这只是我们专业性的问题。 我们如何开展工作的结果。 我们是在努力做到最好还是只是制造? 如果我们关注我们工作的质量,我们不应该只担心我们的工作只是工作。 我们应该担心它是如何工作的。 它在 CPU 和内存使用方面是否最佳? 它是否可维护、可测试、为扩展而开放但为修改而关闭? 我们的代码可靠吗?翻译 2023-06-14 17:58:21 · 347 阅读 · 0 评论 -
[C#] .net 内存管理[1]
在计算机科学中,内存一直存在——从打孔卡到磁带,再到如今复杂的 DRAM 芯片。 它会一直存在,可能以科幻全息芯片的形式出现,或者甚至是我们现在无法想象的更神奇的事物。 当然,记忆在那里不是没有原因的。 众所周知,计算机程序被认为是结合在一起的算法和数据结构。 我非常喜欢这句话。 可能每个人都至少听说过 Niklaus Wirth(Prentice Hall,1976 年)写的 Algorithms + Data Structures = Programs 一书,这句名言就是出自于此。 从软件工程领翻译 2023-06-11 18:44:08 · 296 阅读 · 0 评论 -
[C#] 更进一步,充分利用 .NET 集合
在 .NET 中,我们可以创建和管理可以根据我们的需要动态增长和收缩的集合(即相关对象组)。或者,我们可以使用对象数组。但是,当我们需要固定数量的强类型对象时,可以使用数组。正如我们所理解的,集合在处理对象组时可以提供很大的灵活性。因此,让我们从头开始。.NET 提供了多种集合。每个集合都是一个我们应该实例化的类,然后我们可以使用提供的方法管理(例如,添加、删除、过滤等)它的项目。例如,我们可能需要相同数据类型(例如字符串)的项目或具有键/值对的集合(例如,字符串值的整数键)。翻译 2023-06-07 16:44:24 · 281 阅读 · 0 评论 -
[C#] LINQ 表达式的魔力
英文原文:https://www.jacksondunstan.com/articles/3199 LINQ 表达式与 LINQ 查询不同。它们更像是 C# 本身语法的反射。这是该语言的一个引人入胜且功能强大的领域,我将在今天的文章中对其进行一些探索。 我们今天要讲的核心类是 System.Linq.Expressions.Expression。它是一大堆 SomethingExpression 类的基类,Something 可以代表你可以编写的大量代码。 你看,表达式代表代码,就像类型代翻译 2022-01-16 18:06:09 · 404 阅读 · 0 评论 -
[C#] C#深入浅出4th Edition [3]
本书的这一部分涵盖了在 C# 2(随 Visual Studio 2005 提供)和 C# 5(随 Visual Studio 2012 提供)之间引入的所有功能。 这与本书第三版的全部功能相同。 现在很多感觉就像古老的历史。 例如,我们理所当然地认为 C# 包含泛型。 对于 C# 来说,这是一个非常富有成效的时期。 我将在这部分介绍的一些特性是泛型、可为空的值类型、匿名方法、方法组转换、迭代器、部分类型、静态类、自动实现的属性、隐式类型的局部变量、隐式类型的数组、对象初始化器 、集合初始化器、匿名翻译 2022-01-15 20:09:18 · 1043 阅读 · 0 评论 -
[C#] C#深入浅出4th Edition [2]
1.1.5 平衡效率和复杂性 我记得我第一次使用 Java 的经历; 它被完全解释并且非常缓慢。 一段时间后,可选的即时 (JIT) 编译器变得可用,最终几乎理所当然地认为任何 Java 实现都是 JIT 编译的。 使 Java 表现良好需要付出很多努力。 如果语言失败了,这种努力就不会发生。 但开发人员看到了潜力,并且已经感觉比以前更有效率。 开发和交付速度通常比应用程序速度更重要。 C# 的情况略有不同。 公共语言运行时 (CLR) 从一开始就非常高效。 对与本机代码的轻松互操作以及对性能敏翻译 2022-01-14 23:01:01 · 1110 阅读 · 0 评论 -
[C#] C#深入浅出4th Edition [1]
语境下的C# 当我在大学学习计算机科学时,一位同学纠正了讲师关于他写在黑板上的一个细节。 讲师看起来有点生气,回答说:“是的,我知道。 我在简化。 我在这里掩盖真相是为了展示更大的真相。” 虽然我希望我不会在第 1 部分中掩盖太多,但这绝对是关于更大的真相。 本书的大部分内容都是近距离观察 C#,偶尔将其置于微观范围内以查看最精细的细节。 在我们开始之前,第 1 章会回顾一下 C# 的历史,以及 C# 如何融入更广泛的计算环境。 在我提供本书其余部分的主菜之前,你会看到一些代码作为开胃菜,但在这翻译 2022-01-14 21:50:08 · 692 阅读 · 0 评论 -
[Unity ECS] 如何找到有关 DOTS 包的更多信息?
您想了解有关 DOTS 内部结构的更多信息吗? 我希望你通过寻找答案找到这篇文章的方法。我将快速向您展示如何了解有关 Unity 及其内部结构的更多信息。这是一个很好的灵感来源。作为布雷达应用科技大学的一名游戏开发学生,我可以将研究文件中获得的知识应用到我的 DOTS 项目中,也可以应用到我的 C++ 项目中。从 Unity 源代码中,您可以了解大量面向数据的设计或多线程的一般应用。 我的队友 Menno 在创建native containers的过程中文档停止时,从文件中学到了很多东西!如果你还没翻译 2022-01-11 19:57:32 · 323 阅读 · 0 评论