C#, C♯, C#相談室 Part94

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 935f-5Uxj)
垢版 |
2019/03/20(水) 18:57:36.47ID:ZZcTomnN0
!extend:checked:vvvvv:1000:512
■Visual Studio 2017 Community(無償の統合開発環境)等はこちら
http://www.visualstudio.com/downloads/

■コードを貼る場合はこちら
http://ideone.com/

■前スレ
C#, C♯, C#相談室 Part93
http://mevius.5ch.net/test/read.cgi/tech/1492818720/

■次スレは>>970が建てる事。
建てられない場合は他を指定する事。
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2021/05/16(日) 04:48:26.69ID:CGr30bxH0
functorに関する質問です
C++で次のように書いとけば

template<typename Functor>
double Example( Functor func,・・・){

呼出し時に、引数funcに関数へのポインタでも、ラムダ式でも、関数名でも記述できますが、
C#で同じように、引数に、デリゲートでもラムダ式でも関数名でも記述可能にするにはどーすればいいのでしょうか?
2021/05/16(日) 08:50:12.74ID:8qTwOc620
> 引数に、デリゲートでもラムダ式でも関数名でも記述可能にするには
デリゲート型を指定すればいい
double Example<T>(Func<T, double> func, T obj) { ... }

double ToDouble(Hoge hoge) { return hoge.Value; }
this.Example(obj => obj.Value, hoge);
this.Example(ToDouble, hoge);
this.Example(new Func<Hoge, double>(ToDouble), hoge);

ただしシグネチャが同じでもデリゲート型が違うと無理なのでラムダ式なりとおす必要がある
delegate TRet Converter<TArg, TRet>(TArg arg);
var conv = new Converter<Hoge, double>(obj => obj.Value);
this.Example(conv, hoge); // エラー
this.Example(obj => conv(obj), hoge); // OK
2021/05/18(火) 04:46:17.76ID:MJ7hOma30
System.Collections.Generic.List<System.String> hips =
new System.Collections.Generic.List<System.String>(0);
hips.Add(@"尻");
hips.Add(@"ケツ");
hips.Add(@"Buttocks");
hips.Add(@"んまら");
hips.Add(@"臀");
hips.Add(@"ω");
hips.Add(@"Hip");
foreach (System.String hip in hips) {
System.Console.WriteLine(hip);
}
2021/05/22(土) 21:17:48.56ID:ylKhWhlM0
俺のツレの先輩がc#プログラマに酷い目に遭わされたことがある

c#プログラマから金借りて返さんかったら、拉致られて拷問うけた
指の爪全部ペンチで剥がされてその後ペンチで指先を挟んで潰されたらしい
4本目くらいで痛みに耐え切れなくて舌噛み切って死のうとしたけど死ねなかったって
命までは取られなかったけど指先全部駄目になって切断したみたい
2021/05/23(日) 08:27:53.86ID:ANX6JUnX0
改変コピペ?
2021/05/23(日) 13:27:11.50ID:d15ZAA8n0
そうじゃなかったら知的障害かな
2021/06/05(土) 14:12:36.14ID:Zn+ZYGmH0
メモリ不足での相談です

小さいjpg画像ファイル(1ファイル50KB程度)を10,000ファイル程度
サードパーティ製のGridViewに投げ込んで表示させようとしてます
その前にList<Image>に下のような感じでStreamで投げ込んでいくのですが

var fs = System.IO.File.OpenRead(@filepath);
ListData = new Bitmap(Image.FromStream(fs, false, false));
fs.Dispose();

4000ファイルあたりでメモリ不足に陥ります
VSの診断ツールで見ていると、読み出しはじめて4GBで止まります
メモリが4Gでアウトになっているのは理解できるのですが
ローカル上のファイルの総データ量は800MB程度で、実際に読み込みがとまるあたりでは
せいぜい200MB程度読み込んだ程度と思います
2000ファイル程度にグループごとに都度分けて読み込ますしかないかなと思っていますが
確認すべき点(余計に容量食っている要因)やなにか他に方法があったらご教授ください
2021/06/05(土) 14:18:34.48ID:dB/oWOjW0
>>548
JpegをBitmapに展開してるのだから容量が増えるのは当然では
2021/06/05(土) 15:00:04.47ID:Zn+ZYGmH0
>>549
レスありがとうございます
同サイズ程度のbmpファイルもあるのでそっちでやってみましたが
4000ファイルが6000ファイルくらいに限界数が若干のびだだけでした
2021/06/05(土) 15:05:40.03ID:byK7y7eQ0
https://docs.microsoft.com/ja-jp/visualstudio/profiling/memory-usage?view=vs-2019
2021/06/05(土) 17:36:11.90ID:L7L31nHe0
32bit優先が付いてるとか?
ただどっちみちアプリ全体どころか、1つのリストで4Gもメモリに保持とかは筋がめっちゃ悪いぞ。
4000ものフル画像が同時に必要とかあり得ないし。
表示上必要ならメモリ上にもつならすごく小さなサムネイルをダイナミックに並列処理で作りながら持つとか。
今表示に必要なものだけ、ダイナミックにメモリで並列処理でサムネ作るとかでしょ。
2021/06/05(土) 18:00:28.83ID:Oyn+hOcj0
今時VirtualMode的なものが無いグリッドコントロールなんてあるのか?
2021/06/05(土) 19:41:37.20ID:Zn+ZYGmH0
>>552
やっぱり、そうですよね
実際には10000ファイル越える予定だったのでなおさらですよね
スクロール時のスピード感は多少落ちますが
素直にグリッドコントロールが描画する際に都度読み込むようにすることにします
2021/06/06(日) 18:25:06.49ID:qxB2AhqX0
>>554
良い悪いは置いておいて、とりあえずファイル郡をまとめて読み込んでおくのが
目的で、Bitmapで変換するとメモリを消費してしまうのならば、ファイルの内容を
Streamの配列に読み込んでおいて、表示するときにBitmapで変換するとか
そして表示するだけならばBitmap使わなくてもImageでStreamから読んで
DrawImageでよいんじゃないかなとか
2021/06/06(日) 18:34:20.40ID:SkRnwEhy0
無駄
2021/06/08(火) 10:18:44.68ID:f9CCCXBt0
要するにサムネ表示したいんだろ
SSDなら1万ファイルの読み込みにもそんな時間掛からんし
ファイルをインデクス化して画面に出る部分だけ都度読み込んで描画すればいい
グリッドビューなんて必要かね
2021/06/10(木) 16:49:33.11ID:r3+xqCr00
仮想化すればいいだけの話じゃん
何兆個のファイルがあろうとどうせ表示される項目は多くても数十なんだからスクロール位置などから表示すべきファイルだけサムネ表示すればいい
2021/06/11(金) 13:38:09.74ID:SXyLlFHz0
日本語の変数名使えるのに記号の変数名はダメなのかよ
競馬関係のアプリ開発受注したから予想記号の変数名として分かりやすく記号使いたいのに
2021/06/11(金) 17:10:30.00ID:Ugg65Q0l0
記号で分かりやすくとか頭おかしいんじゃないの?
2021/06/11(金) 19:23:13.76ID:jsNxLdjOM
enumの値とかならまあわからなくもないかな

enum 予想記号 {◎, ○, ▲, △, ☆, ☓};
var 予想 = ◎;

https://umasiru.com/wp-content/uploads/2019/03/IMG_4633-2.jpg
2021/06/11(金) 19:36:06.84ID:W4vbuE8s0
var ◎ = △;
2021/06/11(金) 19:51:40.71ID:oDFfys8F0
何か競馬のあれを連想する
564デフォルトの名無しさん (スップ Sddf-zwXB)
垢版 |
2021/06/29(火) 12:33:01.69ID:Q5UZxny0d
フォームを開いてその画面での処理中に
Form fs = new FormA;
try{
fs.ShowDialog(); ←ここ
}
catch{}

ここのところでハンドルされてないエラーがでて止まります
FormAでの例外処理などには一切ひっかからず
この場合解決の道筋はどこからでしょうか

ちなみにFormAではwebview2でオフィス365のウェブ版エクセルの新規作成を開こうとするとエラーになります
ワードではでないのですが
ここででるエラーは、System.Runtime.interior services.COMEException
0x8007139Fです
2021/06/29(火) 19:49:17.93ID:Fhu3lWMd0
>>564
そのエラーコードでggr
2021/06/29(火) 20:27:18.03ID:rWI2BDyVM
>>564
まず意味が分からんけどFormなの?Dialogなの?
567デフォルトの名無しさん (スップ Sddf-zwXB)
垢版 |
2021/06/29(火) 20:55:15.95ID:Q5UZxny0d
>>566
すみません、書き間違いです
Form fs = new FormA();

>>565
ググったのですが、webview2がnullなってるのだろうと考えられるくらいで、同じケースはなかったです
そもそもなんでワードは開くのにエクセルはwebview2がnullになってしまうのかわからず、どこの時点でそうなるのか調べたいのですが、FormA側ではcatchできず、上の位置で停止するんですよね
2021/06/29(火) 21:01:59.16ID:rWI2BDyVM
それ以前の根本的な問題があるのだろう
君には無理とは言わないがしばらく距離を置こう
2021/06/29(火) 21:47:21.44ID:88YgLK/80
変な所でフォーム表示しようとしてんじゃね
そのコードだけじゃなくてメソッドごと見せてみ
570デフォルトの名無しさん (スップ Sddf-zwXB)
垢版 |
2021/06/30(水) 00:22:51.11ID:Fi37N+TOd
>>569
FormAにはwebview2を配置していて、ブラウジングさせています
通常のサイト閲覧は何も問題ないのですが、ブラウザ上でエクセルが開けるoffice365を使用中、新規作成で開くときだけ呼び出し元のフォーム(上でこことしたところ)で停止します
既存のエクセルファイルなんかはFormA上のwebview2できちんと開けているのですが
なので、自分で書いた特定のメソッド中のエラーではなく、ページ遷移中に停止し、呼び出し元のShowdialogのところに戻ってハンドルエラーになってしまいます
2021/06/30(水) 00:39:45.90ID:4AL6ulTf0
再現する最小コードを作る
それでも不明ならその最小コードを公開して質問
2021/07/03(土) 03:25:24.72ID:ez5RskFXM
ゲイツが収入マイナス7兆円ぐらいで苦しんでる。
c# プログラマから金を集めて、ゲイツに寄付するべきだと思う。

損失の一部 5兆円ほどc#プログラマから強制的に集めたい。国内に5万人ぐらいc#プログラマはいるから、1人1億ぐらい払えばいい。

土地とか家を売ればこんぐらい払えると思う。
払えないひとは肝臓とか売ればいい。
2021/07/03(土) 05:01:54.92ID:DAcib8Yu0
>>572
では早速言い出しっぺのあなた様から肝臓を差し出して下さい
2021/07/03(土) 06:04:33.61ID:+HNBKtJi0
では血をとらずに肝臓だけ取り出してください
2021/07/03(土) 09:59:13.80ID:gTgAsOHbM
何そのハムレット
2021/07/03(土) 10:22:53.43ID:ZeViGhZj0
アンキモ以下の脂肪肝なら処分料が欲しいな
2021/07/03(土) 11:22:03.96ID:fanuEOjba
ヴェニスの商人では?
578デフォルトの名無しさん (ワッチョイ 6f54-SLQ7)
垢版 |
2021/07/05(月) 15:24:59.38ID:ZSz/R5WI0
DBから取得した重複なしの文字列List (要素数約4000) をComboBoxのDataSourceにセットする処理が、
約900ms〜1100msかかり、その間Formが固まるのですが、どうすれば固まるのを回避できるでしょうか。

A5M2でSELECTクエリの所要時間を見ると、だいたい700ms〜900ms台で、ここは改善のしようがなさそうです。
2021/07/05(月) 15:45:29.72ID:5mYpWHh80
ComboBoxで4000の中から選ぶのは大変そうだな
DataSourceに設定する前後にComboBox::BeginUpdate/EndUpdateを呼べば多少は改善すると思う
それ以上はComboBoxじゃ無理じゃないかな 仮想モードもないし
2021/07/05(月) 16:04:21.63ID:yitPGA0i0
やばそう
2021/07/05(月) 16:35:24.72ID:lQZs6uo50
>>578
DBからデータ取得する処理は非同期に
2021/07/05(月) 16:53:08.67ID:S2aqSQgd0
>>578
DBから取得する部分を別スレッドで動作するasyncメソッドにするです
UIの更新は別スレッドなのでInvokeで
2021/07/05(月) 17:11:11.76ID:ynDVyPDO0
awaitしとけばUIスレッドに戻ってくるからInvoke要らんだろ
2021/07/05(月) 17:14:42.74ID:ZSz/R5WI0
みなさんありがとうございます。
BeginUpdateとEndUpdateで20〜40msほど早くなりました。

現状、DBからの取得部分は別スレッドにしています。
ただし、フォーム表示時に、
@ComboBox の DataSource に List をセット。
A別の個所で設定した値で、ComboBox.SelectedItemを決定。
BComboBox.SelectedItem に応じて、それに対応するデータを DataGridView に表示。
という処理をしているので、結局ComboBoxへのDataSourceセット待ちになります。

むしろUIと同じスレッドでデータ取得すればスレッド切り替え処理がなくなって微妙に高速化出来るんじゃ?と思ってます。
2021/07/05(月) 17:33:32.24ID:ZSz/R5WI0
データ取得をUIスレッドで行ってみましたが、別スレッドでしたケースと比較して、実行するたびに優劣変わる程度でした。
これ以上の改善は無理そうなのでいったん諦めます。
2021/07/05(月) 17:41:30.27ID:lQZs6uo50
Formが固まるのを回避したいってのは高速化したいということだったのか・・・
ま、がんばって
2021/07/05(月) 17:41:33.62ID:ykFrWqkT0
>>578
転送時に圧縮かけたら高速化するんじゃね

構成わからんからあてずっぽうでいうけど
DBサーバと近いWEB鯖のPHPでデータ一覧取得してJSONとかで転送(要するにPHPでAPI作成)
サーバの設定等でHTTP圧縮をON
圧縮かかってるから転送そのものが高速化される

どうやって圧縮かけるかは他にも色々やり方あるだろうけどね
LAN内に全てそろってる(例えば同一PC内)としてもかなり速くなるはずだよ

クエリで700msってのが気になるけど時間かかりすぎじゃないかな
Explainみた?

プロファイラはどう?昔はEQATEC Profiler使ってたけど今は何がいいんだろうね
どこにどれぐらいの時間がかかってるかわからないと理論値と比較できない

初見の感想は4000件程度で700msもかかってるのが気になる
応答だけ?それとも結果の羅列まで込みの時間かな
クラサバでそんなにかかる処理ってあまりないと思う
2021/07/05(月) 17:46:44.69ID:ykFrWqkT0
そもそも一瞬で取得すれば固まらないからね
あとはUIに先回りして裏で取得するとか、DB側でキャッシュするとか、小出しにしていくとか・・・

まぁ、一番簡単なのは画面にプログレスバー出してめっちゃ高速に処理してる風を装う事とかだけど

ただ、何も知らずに直観でいうと100msは切るはず
2021/07/05(月) 17:58:05.85ID:7JzKdw7cD
実処理時間と言うより、
取得中に割り込み入れないと固まったように見えるってだけの話では
2021/07/05(月) 18:09:58.95ID:ynDVyPDO0
時間が掛かっているのはデータ取得の部分じゃなくて
取得したデータをコンボボックスに渡す処理(>>584の@)だから
>>579が全てだな
2021/07/05(月) 19:11:56.65ID:IA8ZeXCsa
たぶん「犯人」はComboBoxだろうが一応問題の切り分けが必要だと思って
public Form1()
{
  InitializeComponent();
  var asm = Assembly.GetAssembly(typeof(Form));
  var bl = new BindingList<Type>();
  foreach (var item in asm.GetTypes()) bl.Add(item);

  var sw = Stopwatch.StartNew();
  comboBox1.DisplayMember = "Name";
  comboBox1.DataSource = bl;
  Console.WriteLine($"Time = {sw.ElapsedMilliseconds} ms, Number of Items = {bl.Count}");
}
こんなコードを書いてみた。10年前のポンコツPCで実行してるが約2400個のアイテムをぶち込むのに
デバッグモードでも10ms程度の時間しか掛からない。

つまり「犯人」はComboBoxじゃないんじゃないの?知らんけど。
2021/07/05(月) 19:44:16.85ID:ynDVyPDO0
>>591
フォームのコンストラクタで測ってるけど、フォームがロードされた後で測るとかなり変わるよ
うちの環境ではデバッグビルドで、コンストラクタ:3msec、Loadイベント時:226msec
2021/07/06(火) 01:07:39.66ID:AJxevGXU0
DB の実行計画を見れば?
インデックスを使わずに、全件探索でもしてるのでは?

2分探索なら、2 ^ 10 = 1,024
2 ^ 12 = 4,096

つまり、12回探索するだけ

ミックの本でも読んだ方がよい
2021/07/06(火) 07:28:36.60ID:kC5iABNna
>>593
その前にソートな
2021/07/06(火) 07:38:26.90ID:4w9diVqq0
何言ってんだこいつ
2021/07/06(火) 07:47:40.70ID:Jcre+LWcM
インデックス張ったら挿入や更新の度に毎回ソートしてるとでも思ってるんだろ
2021/07/06(火) 08:22:21.59ID:PbL+Rk1v0
全件探索なら1回探索するだけ♪
2021/07/06(火) 08:54:22.76ID:4hP0mNbe0
約900ms〜1100msの処理のうち
クエリが700ms〜900ms台で、改善のしようがないっていってるんだから
それがホントなら速度的なものはどうしようもないと思うんだが

画面が固まる対策ならクエリを非同期に(正確にはUIスレッド以外で、か)しろで終わりだろ
2021/07/06(火) 09:08:47.43ID:juTGPN6qM
ルビおじに絡むおじさんはルビおじよりさらに無能だからな
2021/07/06(火) 11:25:26.74ID:J1QHRuI00
やったことないけど、コンボボックスも仮想化できるらしいから試してみたら?
データ取得を非同期に出来てるなら画面が固まることは無くなりそう
https://docs.microsoft.com/ja-jp/dotnet/desktop/wpf/advanced/optimizing-performance-controls?view=netframeworkdesktop-4.8#controls-that-implement-performance-features
2021/07/06(火) 11:36:28.26ID:azFxX9aU0
>>600
それWPF
>>578はWinFormsみたいだけど
2021/07/06(火) 18:11:30.42ID:RaE3JhC/0
WinFormsのComboBoxに仮想モード追加する例ってありそうで無いな
2021/07/06(火) 21:55:13.16ID:Rt0qzyHm0
じゃ俺がWinFormsのComboBoxを仮想化する知恵を貸そうか?
2021/07/06(火) 22:04:24.92ID:4w9diVqq0
まああてにするな
2021/07/06(火) 22:18:48.94ID:HsJYefQaa
どうぞどうぞって言おうと準備してたのにw
2021/07/07(水) 02:05:48.56ID:jIHjttY10
じゃあ代わりに言うか
「どうぞどうぞ」
2021/07/07(水) 03:00:22.72ID:sX4an4wR0
みなさん本当にありがとうございます。

原因は、約4000の要素をDBから取り出す所要時間でした。
約60万レコード内の、文字列カラムのデータを、重複しないように、GROUP BYする処理が時間食ってました。

なので、該当の文字列カラムだけを重複なしで格納するキー一覧テーブルを作り、
データINSERT時に、キー一覧テーブルの既存レコードと一致しない文字列だけをキー一覧テーブルに追加するトリガー処理を作りました。

そして、ComboBox の DataSourceにはそのキー管理テーブルのデータをセットするようにして、表示所要時間を5〜6割短縮出来ました。
2021/07/07(水) 06:50:16.04ID:oDfnQi3+M
高々60万レコードの group by に700msって遅くね?
DBMS 何使ってるのかわからんけどインデックス張るだけで良いような気もするが…
2021/07/07(水) 07:38:37.09ID:F/xqoSBh0
マテリアライズドビュー作るとか
2021/07/07(水) 10:41:15.77ID:qNxZ5hgE0
GROUP BY自体が遅いもんよ
SQLが悪いとインデックス使っても無視されてFULL検索になってしまう
2021/07/07(水) 12:33:18.92ID:GxuaumQya
それより結局ComboBoxは何の関係もなかったってことだよね?

つまりボトルネックがどこにあるのか計測して確認もせず思い込みで
ComboBoxが悪いとミスリードな質問をした。

ここは反省して欲しい。
2021/07/07(水) 12:57:56.68ID:urFk1IqDa
>>611
やれやれ
2021/07/07(水) 13:00:11.32ID:FuIb4wxP0
最初の質問で問題の処理に約900ms〜1100msかかっていてそのうちクエリの所要時間が700ms〜900ms台と書いていて、その上でクエリ以外の部分(約200ms)を改善したいという話だったから測ってないわけではないかと
クエリ部分は改善不可能と思い込んでたのはあるが
2021/07/07(水) 13:00:41.99ID:ylMxxyrU0
>>611は毎度お馴染みで皆さんご存知の、
ComboBoxに責のあるマイクロソフトの犬
2021/07/07(水) 15:16:07.20ID:Z3N+pbe10
最初に戻ると結局画面は固まってなかったってことなんだろうな
これが一番のミスリード
2021/07/07(水) 15:26:49.85ID:jKQg8TjQ0
FormのLoadで何も表示されないまま1秒以上かかるとかなり固まった感は強い
だからスプラッシュやプログレスバーというのは非常に大事
これがあるだけでクレーム率はかなり下がる

速度最適化というのは実際のレスポンスやスループットだけではなくて
体感速度も最適化するべきなんだ
2021/07/07(水) 15:38:40.22ID:O4oUzSnJ0
いや、クエリの間は固まってたんじゃね
そういう意味ではコンボボックスは無関係だな
2021/07/07(水) 19:17:38.62ID:Z3N+pbe10
別スレッドで取得してるって言ってんのに?
2021/07/07(水) 20:02:39.26ID:vUBZA2na0
別スレッドの処理終了を同期で待ってたら固まるよね
2021/07/07(水) 20:04:38.68ID:iooPCaard
別スレッドでの取得結果を待たずにコンボボックスが表示できるとは知らんかった
2021/07/07(水) 20:05:37.60ID:UGIg3KO/0
空のはできるんじゃないの?
2021/07/07(水) 20:07:38.45ID:iooPCaard
>>621
それが期待する動作だったとは読み取れなかったわ…
2021/07/07(水) 20:37:31.96ID:vUBZA2na0
なるほど
同期で待つのと非同期で待つ違いがわかってなかったのか
2021/07/07(水) 20:54:47.64ID:GxuaumQya
>>613
なるほどね。読み返してみると確かにそういう風に読めないこともない。
でもその解釈だと辻褄が合わないように聞える部分もいろいろあるね。
まあ揚げ足取りは本意じゃないのでこれで
2021/07/07(水) 21:14:19.97ID:WowgMcxm0
>>610
group by の動作原理考えればそうでしょう
ソートと集計の複合技でっせ

EFを初心者に進めたくないのがその辺りかな
実行計画取れやと言いたくなって来る
2021/07/07(水) 21:32:17.55ID:PTZA0JCFM
>>622
期待する動作は
> その間Formが固まるのですが、どうすれば固まるのを回避できるでしょうか。
だよ?
2021/07/07(水) 23:15:16.70ID:O4oUzSnJ0
その間ってのがどこからどこまでか
固まるとはどういうことか
が、普通に考えるのとずれてるんだがな
2021/07/08(木) 05:59:22.31ID:bp32MkoMa
>>623
初心者なので詳しく教えてください。
2021/07/08(木) 06:08:48.29ID:4npUp7i4M
お前さんの普通なんて知らんがな
2021/07/08(木) 07:08:26.32ID:ynxscpbq0
今回みたいなケースは再現しようがないから想像するしかないんだよな
齟齬が出るのはしょうがない
631デフォルトの名無しさん (ワッチョイ 355f-xNKK)
垢版 |
2021/07/10(土) 10:35:48.26ID:o1Fr1a0g0
メインウィンドウが開かれるのに時間がかかる場合って自動的にマウスカーソルに砂時計付くよね
これってWindows 10だけの機能なのかな?
スプラッシュはそういうことに気付かない人にはわかりやすいからいいと思うけど
2021/07/11(日) 15:20:44.65ID:ODsLgHFcM
C#について詳しくなりたい。
.net独学だからテクニックが全く身についてこない。
働きながら学べる人たちが羨ましい。
2021/07/11(日) 16:47:39.95ID:UTF+PuFAM
>>632
働いてはどうでしょうか
2021/07/11(日) 16:53:56.36ID:JpOAcHlL0
>>632
Effective C#とMore Effective C#買って読めば
2021/07/12(月) 09:28:12.82ID:ReFnqSuP0
>>632
オープンソースのソフトウェアをただそのまま使うのではなく
自分で使いやすいよう改造して使ってみたらどうかな
2021/07/12(月) 14:04:49.78ID:DOYT8O/O0
ひとが使いためのライブラリ作らない限りテクニックなんかロクに身に付かんでしょ。
テクニックが要らないように作られれてるのが人気があるライブラリなんだから。
2021/07/12(月) 17:05:33.06ID:ihSDWtOf0
async・awaitを使った非同期処理の並列処理数をSemaphoreSlim使って制御しています。

https://qiita.com/tadokoro/items/28b3623a5ec58517d431
を見ると、SemaphoreSlimのパフォーマンスはそこまで良くないらしいんですが、async・awaitを使いつつパフォーマンスを上げる方法はないでしょうか?
並列処理数の上限は4が理想です。※多ければ多いほどいいのはいいです。

SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1,4)
await semaphoreSlim.WaitAsync();
try {
await 自分の非同期メソッド
}
finally {
semaphoreSlim.Release();
}
2021/07/12(月) 18:01:24.85ID:AiE5hxvs0
必要な場所にだけlockを掛ける
lock不要なロジックにする
2021/07/12(月) 18:04:26.22ID:hnMq5MVY0
>>637
await,asyncはlock使えないから基本>>638の通り排他不要にするか、そのコードで頑張るしかないんじゃね
2021/07/12(月) 18:33:51.33ID:4WArcuIG0
>>637
そのベンチマークは同期のオーバーヘッドを気にするくらい
ゴリゴリ共有リソースにアクセスする場合のための比較だから
4並列でawaitするような処理をする場合とは全然違うものじゃない?
2021/07/12(月) 19:18:50.72ID:xUxV3tpC0
async,awaitってlock使えないのか。。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況