.Net Core でプログラムのパフォーマンスを向上させるために ref と Span を使用する方法の実装コード
この記事では、プログラムのパフォーマンスを向上させるために .Net Core で ref と Span
7.0 の言語機能であり、開発者にローカルの 変数参照 を返すメカニズムを提供します。
Span も ref 構文に基づく複雑なデータ型 です。記事の後半では、その使用方法を示す例を示します。 2. Refキーワード
refにしてもoutキーにしても、
におけるポインタの操作など、理解や操作が比較的難しい言語機能ですが、そのような高度な構文とは何でしょうか?これにはいくつかの副作用が伴いますが、これは大したことではないと思います。また、すべての C# 開発者がこれらの内部動作メカニズムを深く理解する必要があるわけではありません。複雑さに関係なく、人々に自由な選択を提供しているだけだと思います。リスクと柔軟性は決して両立しません。 参照とポインターの類似性を説明するために、いくつかの例を見てみましょう。 もちろん、次の使用法は C# 7.0 以前でも使用できます: public static void IncrementByRef(ref int x)
{
x++;
}
public unsafe static void IncrementByPointer(int* x)
{
(*x)++;
}
は、それぞれ ref と非安全なポインターを使用します。パラメータ +1 を完成させます。
int i = 30; IncrementByRef(ref i); // i = 31 unsafe{ IncrementByPointer(&i); } // i = 32
C# 7.0で提供される機能は以下のとおりです:
1.ref locals (ローカル変数参照)int i = 42;
ref var x = ref i;
x = x + 1;
// i = 43
returns (戻り値参照)
ref returns は、C# 7 の強力な機能です。次のコードは、その機能を最もよく反映しています。この関数は、特定の int
array 参照を返します。 item: public static ref int GetArrayRef(int[] items, int index) => ref items[index];
System.Span は、System.Memory.
dll アセンブリの下にある .Net Core コアの一部です。現在、この機能は独立していますが、将来 CoreFx に統合される可能性があります 使用方法?次の NuGet パッケージは、.Net Core 2.0 SDK によって作成されたプロジェクトの下で参照されます: <ItemGroup>
<PackageReference Include="System.Memory" Version="4.4.0-preview1-25305-02" />
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="4.4.0-preview1-25305-02" />
</ItemGroup>
を操作するポインター (T*) のような方法を見てきました。基本的に、.NET システムではポインターの操作は適切なイベントとは見なされません。 もちろん、.NET は単一値の参照を安全に操作するための ref を提供します。しかし、単一の値は、「ポインター」を使用するユーザーのニーズのほんの一部にすぎません。ポインターの場合、より一般的な状況は、連続したメモリ空間で一連の「要素」を操作する場合です。 スパンは、既知の長さとタイプの連続したメモリ ブロックとして表されます。メモリ領域ポインタへの安全なアクセスを提供するという点で、多くの点で T[] または ArraySegment と非常に似ています。実際、これは .NET の操作 (void*) ポインターの抽象化であると私は理解しています。C/C++ に詳しい開発者は、これが何を意味するのかをよく理解する必要があります。
スパン機能は次のとおりです: •配列、アンマネージ ポインタ、スタック ポインタ、固定または固定された管理データ、および値の内部領域への参照を含む、すべての連続メモリ空間の型システムを抽象化します
• CLR 標準のオブジェクト型と値型をサポートします•ジェネリクスをサポートします
•独自に管理および解放する必要があるポインターとは異なり、GC をサポートします 構文的にも意味的にも ref: に関連する Span の定義を見てみましょう。 public struct Span<T> {
ref T _reference;
int _length;
public ref T this[int index] { get {...} }
...
}
public struct ReadOnlySpan<T> {
ref T _reference;
int _length;
public T this[int index] { get {...} }
...
}
string content = "content-length:123"; Stopwatch watch1 = new Stopwatch(); watch1.Start(); for (int j = 0; j < 100000; j++) { int.Parse(content.Substring(15)); } watch1.Stop(); Console.WriteLine("\tTime Elapsed:\t" + watch1.ElapsedMilliseconds.ToString("N0") + "ms");
理由 この例では、文字列を操作するたびに、int.Parse を実行する際に、新しい文字列オブジェクトが繰り返し生成されるという例を示します。多数の操作を実行すると、GC 圧力が損傷する可能性があります。
このアルゴリズムを実装するには Span を使用します:
string content = "content-length:123"; ReadOnlySpan<char> span = content.ToCharArray(); span.Slice(15).ParseToInt(); watch.Start(); for (int j = 0; j < 100000; j++) { int icb = span.Slice(15).ParseToInt(); } watch.Stop(); Console.WriteLine("\tTime Elapsed:\t" + watch.ElapsedMilliseconds.ToString("N0") + "ms");
这里将string转换为int的算法利用ReadonlySpan实现,这也是Span的典型使用场景,官方给的场景也是如些,Span适用于多次复用操作连续内存的场景。
转换代码如下:
public static class ReadonlySpanxtension { public static int ParseToInt(this ReadOnlySpan<char> rspan) { Int16 sign = 1; int num = 0; UInt16 index = 0; if (rspan[0].Equals('-')){ sign = -1; index = 1; } for (int idx = index; idx < rspan.Length; idx++){ char c = rspan[idx]; num = (c - '0') + num * 10; } return num * sign; } }
四、最后
上述两段代码100000次调用的时间如下:
String Substring Convert: Time Elapsed: 18ms ReadOnlySpan Convert: Time Elapsed: 4ms
目前Span的相关支持还够,它只是最基础架构,之后CoreFx会对很多API使用Span进行重构和实现。可见.Net Core的性能日后会越来越强大。
以上が.Net Core でプログラムのパフォーマンスを向上させるために ref と Span を使用する方法の実装コードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











ref を介して要素ノード ref を取得することは、vue2 の js ネイティブ document.getElementById("#id") 操作を簡素化すると言えます。もちろんvue3でも同様で、まず取得したい要素にref属性を与え、その値にアクセスするためのrefオブジェクトを作成します。これにはセットアップでアクセスできますが、直接出力される値は null です...セットアップ関数の実行時間は html タグのレンダリングよりも前である必要があるため、セットアップ関数でボックス タグを直接初期化することはできません。ライフサイクル関数では、セットアップ関数は beforeCreat です。

現在、人工知能(AI)技術の開発は本格化しており、さまざまな分野で大きな可能性と影響力を発揮しています。本日、Dayao は、参考にしていただけるよう、4 つの .NET オープン ソース AI モデル LLM 関連プロジェクト フレームワークを共有します。 https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.mdSemanticKernelSemanticKernel は、OpenAI、Azure などの大規模言語モデル (LLM) を統合するように設計されたオープン ソース ソフトウェア開発キット (SDK) です。

ref を使用した vue3 のパフォーマンス警告問題 ref を使用した場合のパフォーマンス警告コードは次のとおりです import{ref,shallowRef}from"vue";importTodoListfrom"./components/TodoList.vue";importRatefrom"./components/Rate.vue" ;lettabs={ TodoList,Rate}letcurrentTabComponent=ref(TodoList)warn ランタイム コア。

ref の基本特性は、reactive ({value: })console.log('refa:',refa)//RefImpl{...}console.log('refa:',refa.value)// とほぼ同じです。 6console.log('rcta:

Vue3 は ref インスタンスを取得し、それを ts の InstanceType と組み合わせます。テンプレート参照がある場合もありますが、それを使用する場合、ts プロンプトは機能しません。defineExpose を通じてコンポーネントによって公開されるメソッド名のプロンプトは表示されません。大きな影響はありません、解決できる、または解決できます~import {ref}from'vue'constsayHello=()=>(console.log('I can Say hello'))defineExpose({sayHello}) 次にこれを親レベルで使用し、MyModalR を入力します。

Vue3ref バインディング DOM またはコンポーネントの失敗理由分析シナリオの説明 Vue3 では、コンポーネントまたは DOM 要素をバインドするために ref を使用することがよくありますが、関連するコンポーネントをバインドするために ref が明確に使用されていることがよくありますが、ref バインディングが失敗することがよくあります。 ref バインディングが失敗する状況の例 ref バインディングが失敗するほとんどのケースは、ref がコンポーネントにバインドされているときにコンポーネントがまだレンダリングされていないため、バインディングが失敗することです。または、コンポーネントが最初にレンダリングされず、ref がバインドされていない場合、コンポーネントのレンダリングが開始されると、ref もバインドされ始めますが、ref とコンポーネントの間のバインディングが完了していません。このとき、問題が発生します。コンポーネント関連のメソッドを使用する場合。 ref にバインドされたコンポーネントが v-if を使用するか、その親コンポーネントが v-if を使用してページに

1. refref 属性は要素の取得に加えて、ref 関数を使用して応答性の高いデータを作成することもでき、データ値が変更されるとビューが自動的に更新されます。 import{ref}from'vue'letstr:string=ref('私は張三です')constchang=()=>{str.value='私はダイヤモンド王老武です'console.log(str.value)}{ {値 2 を変更します。isRef は、変数が ref でラップされたオブジェクトであるかどうかを確認します。
