てくメモ

trivial な notes

2023-05-01から1ヶ月間の記事一覧

【C#】ジェネリック型引数の型の new()

C#

ジェネリック型引数の型のインスタンスを作成したいという場合がある。このときはまず、型制約のnew()制約が考えられる。 public interface IInterface { } public IInterface GenericNew<T>() where T : IInterface, new() { return new T(); } ただ、これは内</t>…

【C#】(int, int).GetHashCode の衝突

C#

以下の記事によれば、-1000~1000 の範囲で(int, int).GetHashCodeを検証したところ、98.3%衝突していたということ。 C#でDictionaryのキーに2つのintを使いたい場合の性能比較 (ただしキーの範囲は[-32768, 32767]) 数字が衝撃的なので、自分でも確認してみ…

【C#】算術のいくつかの最適化 tips を測ってみる

C#

アルゴリズムではない tips 的な算術の最適化、例えば、除算ではなく逆数を乗算する、のようなものが、どの程度効用があるのかを測って確かめてみる。なお、体系的なものではなくて、並べているだけ。 除算(逆数の乗算) 奇数偶数判断(ビット演算) 絶対値…

【C#】一次元配列を二次元に回転

C#

width と height のあるデータを一次元で扱っているとき、それを回転することを考える。なお、並べ替え先に外部領域を使う。また、記事名は配列としているが、記事内のコードはSpanとして扱っている。 参考イメージ画像。 0° 右回転 右90°行と列が入れ替わる…

【C#】文字列から<T>型への汎用コンバート

C#

【追記】 .NET 8 以降は、IParsable<T>インターフェースでこの記事の範囲のことを扱えます。 【C#】文字列から<T>型への汎用コンバート : IParseble<TSelf> - てくメモ 例えば文字列からのジェネリックな汎用コンバートを用意したいとする。このとき、手段としてTypeConv</tself></t></t>…

【C#】IEnumerable<T>.ToXXX 系の確認

C#

以下の記事で、IEnumerable<T>.ToArrayの中身を確認した。 【C#】IEnumerable<T>.ToArray の中身を確認 - てくメモこの機会に、それ以外のコレクションにするメソッド(ToList、ToDictionary、ToHashSet、ToLookup)を確認しておく。ちなみに、変わったことはなか</t></t>…

【C#】列挙せずに要素の数の取得を試みる IEnumerable<T>.TryGetNonEnumeratedCount

C#

IEnumerable<T>.TryGetNonEnumeratedCount(out int)メソッドは、列挙せずに要素の数の取得を試みることができる。(.NET 6 ~)とりあえず確認用のクラスを用意して、Count()と並べてみる。 // 確認用クラス private class SignalItem { public SignalItem Sign</t>…

【C#】IEnumerable<T>.ToArray の中身を確認

C#

IEnumerable<T>を列挙済みにしたり、あるいはコピーとして使ったりするToArray。 活躍の機会が多いだけに中身を確認しておく。 まず、IEnumerable<T>.ToArrayは拡張メソッドであり、Enumerable.ToArray<TSource>に定義されている 参考:Source Browser public static TSourc</tsource></t></t>…

【C#】Span.Overlaps を見る

C#

Span に拡張メソッドとして生えているOverlapsメソッドが気になったので、簡単に確認してみる。 MemoryExtensions.Overlaps メソッド (System) | Microsoft Learn このメソッドは、ある Span が別の Span とメモリ上で重なっているかを判定するもの。まず、…

【C#】null の Span

C#

連続したメモリ領域を表すSpan<T>は、nullを受けることもできる。 その場合、== nullで中身の参照のnullチェックができる。 int[]? array1 = null; int[]? array2 = new int[] { 1, 2, 3 }; ReadOnlySpan<int> span1 = array1; ReadOnlySpan<int> span2 = array2; Console</int></int></t>…

【C#】ImageSharp 3.0 : ピクセルを扱ってアートをつくってみる

C#

C# (.NET) で画像を扱うためにはいくつか選択肢があるが、ImageSharp はそのひとつ。 GitHub - SixLabors/ImageSharp: A modern, cross-platform, 2D Graphics library for .NET他の選択肢に対して full managed だがパフォーマンスに劣るというような感じだ…

【C#】正規乱数 (2):逆関数法, Ziggurat 法

C#

前回記事の続き。 【C#】正規乱数 (1):Box-Mullar 法, 中心極限定理を利用した方法 - てくメモ 逆関数法 近似によって求まった、正規分布の累積分布関数の逆関数を用いる手法がある。そのひとつが以下のリンク。 An algorithm for computing the inverse no…

【C#】正規乱数 (1):Box-Mullar 法, 中心極限定理を利用した方法

C#

正規分布に従った乱数の高速な生成アルゴリズムである Ziggurat 法の詳説記事を見た。 詳説 Ziggurat 法 ~ 正規分布・指数分布乱数の高速生成 - 屋根裏工房改非常に詳しい解説がなされている。 知識として Ziggurat 法が速いらしいというのは聞いていたけれ…

【C#】xoshiro 法の Random にシード(状態)を与える

C#

.NET 6.0 以降のRandomクラスは、シード指定時と未指定時で使用されるアルゴリズムが異なり、未指定時のみ xoshiro 法が用いられる。 参考:.NET 6 (Preview) における System.Random の実装変更 - 屋根裏工房改シード指定では従来型のアルゴリズムが用いら…

【C#】Span を Stack<T>.PushRange する

C#

前回記事の事実上の続き。 【C#】Span を List<T>.AddRange する - てくメモ Stack<T>に複数の値を一度に渡すPushRange(span)的なものを考える。事実上前回の続きと冒頭に書いてしまっているのだから、最初からそれを。 ビューという知見を活かすと次のように書け</t></t>…

【C#】Span を List<T>.AddRange する

C#

※ この記事は以下のリンク先で学習した内容であり、参考リンク様1ページの内容が引き伸ばされたものになります。 C#11 による世界最速バイナリシリアライザー「MemoryPack」の作り方 - Speaker Deck 【追記】 .NET 8 ではList.AddRange(ReadOnlySpan)とでき…

【雑記】上位 k 件を得る (3) - 余談

前回記事までの余談。余談なので雑記。 【C#】上位 k 件を得る (2) - ヒープセレクトと部分ソート - てくメモ 部分ソートの適用場面のひとつとして 、k 件を得ることに対して母数が大きいということ以外に、何らかの理由でソートに伴う要素の交換回数そのも…

【C#】上位 k 件を得る (2) - ヒープセレクトと部分ソート

C#

前回の続き。 【C#】上位 k 件を得る (1) - ヒープソート - てくメモ さて、上位 k 件を得ることを考える。 (※ 以下、昇順の上位のこと。降順上位の場合は Comparer を降順用にするなどすればOK) まず単純に、全件をソートしてから k 件までの範囲を得る方…

【C#】上位 k 件を得る (1) - ヒープソート

C#

一記事にまとめるとボリューミー過ぎるので分割。 なお、この記事には上位 k 件を得る話までいかず、ヒープソートの話まで。ヒープ構造は数々の場所で解説されてるのであえてその解説はせず、C++ のmake_heap、pop_heap、sort_heapの C# 実装といった感じの…

【C#】代替データストリームの単純な読み書き

C#

主にマルウェアの関連で耳にする代替データストリーム (Alternate Data Stream / ADS) を、C#で単純に読み書きする。なお、マルウェア云々は以降で特に触れないので参考文献を挙げておく。 参考:代替データストリームの危険性と、閲覧/削除機能 C#における…

【C#】範囲の概念のある処理の引数に範囲構文を導入する

C#

スライシングでお世話になる範囲構文。 var span = new int[] { 1, 2, 3, 4, 5 }.AsSpan(); var a = span[..]; // 1, 2, 3, 4, 5 var b = span[3..]; // 4, 5 var c = span[..3]; // 1, 2, 3 var d = span[2..4]; // 3, 4 var e = span[^1..]; // 5 var f = …

【C#】ReadOnlySpan<char>.Split リベンジ

C#

【追記】 .NET 8 ではReadOnlySpan<char>.Split(Span<Range>, char, StringSplitOptions)とできる拡張メソッドが追加され、この記事でやりたかったようなことが標準で行えるようになっています。 【C#】ReadOnlySpan<char>.Split をつくったけれど、反省があった話 - てくメモ </char></range></char>…

【C#】ゼロアロケーションバイト列

C#

【追記】 byte, sbyte以外にも対象が拡大されました。 【C#】ReadOnlySpan<T>最適化の確認 - てくメモ バイト列はゼロアロケーションに最適化される場合がある。 参考:静的なデータの ReadOnlySpan 最適化 | ++C++; // 未確認飛行 C ブログ // アロケーション</t>…

【C#】文字列中の特定の文字や文字列をカウントする

C#

【追記】 .NET 8 では、ReadOnlySpan<T>にCount(T)・Count(ReadOnlySpan<T>)とできる拡張メソッドが追加されました。StringComparisonが不要の場合、(文字列をAsSpan()して)それらを利用するのが簡潔で速いです。文字列中の特定の文字(1文字)や文字列をカウン</t></t>…