ホームページ バックエンド開発 C#.Net チュートリアル .Net Core でプログラムのパフォーマンスを向上させるために ref と Span を使用する方法の実装コード

.Net Core でプログラムのパフォーマンスを向上させるために ref と Span を使用する方法の実装コード

May 21, 2017 am 11:11 AM

この記事では、プログラムのパフォーマンスを向上させるために .Net Core で ref と Span を使用する簡単な実装コードを主に紹介します。 ref については、多くの学生はすでによく知っています。Ref は

C#

7.0 の言語機能であり、開発者にローカルの 変数参照 を返すメカニズムを提供します。

Span も ref 構文に基づく複雑な

データ型 です。記事の後半では、その使用方法を示す例を示します。 2. Refキーワード
refにしてもoutキーにしても、

C言語

におけるポインタの操作など、理解や操作が比較的難しい言語機能ですが、そのような高度な構文とは何でしょうか?これにはいくつかの副作用が伴いますが、これは大したことではないと思います。また、すべての C# 開発者がこれらの内部動作メカニズムを深く理解する必要があるわけではありません。複雑さに関係なく、人々に自由な選択を提供しているだけだと思います。リスクと柔軟性は決して両立しません。 参照とポインターの類似性を説明するために、いくつかの例を見てみましょう。 もちろん、次の使用法は C# 7.0 以前でも使用できます:

public static void IncrementByRef(ref int x)
{
 x++;
}
public unsafe static void IncrementByPointer(int* x)
{
 (*x)++;
}
ログイン後にコピー
上記の 2 つの

関数

は、それぞれ ref と非安全なポインターを使用します。パラメータ +1 を完成させます。

int i = 30;
IncrementByRef(ref i);
// i = 31
unsafe{
 IncrementByPointer(&i);
}
// i = 32
ログイン後にコピー

C# 7.0で提供される機能は以下のとおりです:

1.ref locals (ローカル変数参照)

この例では、xの値が次の場合のローカル変数iの参照xです。変更すると、変数 i の値も変更されます。

2.ref

returns (戻り値参照)

ref returns は、C# 7 の強力な機能です。次のコードは、その機能を最もよく反映しています。この関数は、特定の int

array

参照を返します。 item:

public static ref int GetArrayRef(int[] items, int index) => ref items[index];
ログイン後にコピー
添字を介して配列内の項目の参照を取得します。参照値が変更されると、それに応じて配列も変更されます。

3. Span

System.Span は、System.Memory.

dl

l アセンブリの下にある .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>
ログイン後にコピー
上では、ref キーワードを使用して提供できる単一値

オブジェクト

を操作するポインター (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 {...} }
 ...
}
ログイン後にコピー
次に、直感的な例を使用して Span の使用シナリオを説明します。例として、文字インターセプトと文字変換 ​​(整数への変換) を取り上げます。 "content-length:123", 123 を整数に変換するには、まず Substr

して数値と関係のない文字列を切り詰めます。変換コードは次のとおりです。

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(&#39;-&#39;)){
   sign = -1; index = 1;
  }
  for (int idx = index; idx < rspan.Length; idx++){
   char c = rspan[idx];
   num = (c - &#39;0&#39;) + 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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

vue3のrefを通じて要素ノードを取得する方法 vue3のrefを通じて要素ノードを取得する方法 May 16, 2023 pm 12:25 PM

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

C# の雇用の見通しはどのようなものですか? C# の雇用の見通しはどのようなものですか? Oct 19, 2023 am 11:02 AM

初心者でも経験豊富なプロフェッショナルでも、C# をマスターすることでキャリアへの道が開かれます。

いくつかの .NET オープンソース AI および LLM 関連プロジェクト フレームワークを共有する いくつかの .NET オープンソース AI および LLM 関連プロジェクト フレームワークを共有する May 06, 2024 pm 04:43 PM

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

refを使用してvue3のパフォーマンス警告問題を解決する方法 refを使用してvue3のパフォーマンス警告問題を解決する方法 May 13, 2023 pm 03:10 PM

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

vue3+ts で ref と reactive を使用して型を指定する方法 vue3+ts で ref と reactive を使用して型を指定する方法 May 10, 2023 pm 07:19 PM

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

vue3 が ts InstanceType と組み合わせた ref インスタンスを取得する問題を解決する方法 vue3 が ts InstanceType と組み合わせた ref インスタンスを取得する問題を解決する方法 May 20, 2023 pm 10:59 PM

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

vue3 で dom またはコンポーネントへの ref バインディングが失敗する理由とその解決方法は何ですか? vue3 で dom またはコンポーネントへの ref バインディングが失敗する理由とその解決方法は何ですか? May 12, 2023 pm 01:28 PM

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

vue3のref、isRef、toRef、toRefs、toRawの使い方 vue3のref、isRef、toRef、toRefs、toRawの使い方 May 10, 2023 pm 08:37 PM

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

See all articles