C#, C♯, C#相談室 Part92 [無断転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2017/01/28(土) 16:46:53.58ID:op86qfG/http://www.visualstudio.com/downloads/
■コードを貼る場合はこちら
http://ideone.com/
■前スレ
C#, C♯, C#相談室 Part91
http://echo.2ch.net/test/read.cgi/tech/1467211515/
■次スレは>>970が建てる事。
建てられない場合は他を指定する事。
0263デフォルトの名無しさん
2017/02/28(火) 20:37:44.89ID:Fq1JMnLGエスパーさんはいらないから
汎用性のないコードだってのならともかく「本来はこんな問題のはず」とか議論しても何もならん
0264デフォルトの名無しさん
2017/02/28(火) 21:08:18.23ID:pIiGTdLDどこが実践で使えないんだ(笑)
0265デフォルトの名無しさん
2017/02/28(火) 21:15:58.55ID:wrouDyFM0266デフォルトの名無しさん
2017/02/28(火) 21:19:57.27ID:BFmlECVlCopyToを使って動かしてみると、マージされているセルなどが思った通りにはコピーされないようです。
worksheet.Range(rowno + 2 + ":" + rowno + 3).CopyTo(worksheet.Range(rowno + 4 + ":" + rowno + 5));
お助けください
0267デフォルトの名無しさん
2017/02/28(火) 21:34:46.83ID:A2md68KBこういうの気持ち悪い
0268デフォルトの名無しさん
2017/02/28(火) 21:59:17.96ID:39alJvfiStreamReaderをCloseしようね
内部的には同じだけどFile.ReadLines()を使ってElementAt()とかで目的の行が取れるよ
0269デフォルトの名無しさん
2017/02/28(火) 22:08:38.41ID:s47hQ+GZじゃ、お前んとこってテキストファイルの行数でデータ定義するの?
0270デフォルトの名無しさん
2017/02/28(火) 22:11:57.45ID:39alJvfi0271デフォルトの名無しさん
2017/02/28(火) 22:14:30.88ID:pIiGTdLD普通にID管理だけど、チートやバグが発生した場合に行数管理で正常か
どうか判断する局面も有るけど?
0272デフォルトの名無しさん
2017/02/28(火) 22:24:32.74ID:+WocOs48測定データ1分1行で定義されてて、1日置き=1440行ごと読み出しとか、行数でのデータ取扱なんてざらだよ
0273デフォルトの名無しさん
2017/02/28(火) 23:03:34.74ID:s47hQ+GZ面倒でも日時入れるわ
データがないとき(?)って空白出すの?
超面倒じゃん
データがないって判定もヤバそう
0274デフォルトの名無しさん
2017/02/28(火) 23:10:22.11ID:AHF/JWRtReadLinesは全部メモリに読むから、ファイルがでかい可能性があるなら避けたほうがよいかも
0275デフォルトの名無しさん
2017/02/28(火) 23:12:03.23ID:z/77EZzb運用が面倒臭すぎる
0276デフォルトの名無しさん
2017/02/28(火) 23:25:18.45ID:39alJvfi読まないよ
全部読むのはReadAllLines
0277デフォルトの名無しさん
2017/03/01(水) 01:43:58.56ID:jez9uqUVテキスト読み出しながら、登録したキーワードに引っかかったらreplaceする必要があるんだけど、(足りない脳味噌の範囲で)どうやってもクッソ遅い。
キーワードと置換後文字はDictionaryで管理してるけど、そもそもキーワードが8200程ある上に、テキストも1ファイルあたり平均約2.7万文字あってもう無理(テキストファイルは1日あたり1600ほど生産されてる)
速度は諦めるしかない?
0278デフォルトの名無しさん
2017/03/01(水) 01:54:31.83ID:XgpeB6sRすまん、そうだった
0279デフォルトの名無しさん
2017/03/01(水) 04:22:26.99ID:uGJVx5D1どのくらいで遅いって言ってるのか次第じゃない?
キーワードにマッチする単位で単語分割できてれば入力の単語単位で辞書にぶつけるのが効率よさそう
ただ3万文字程度ならキーワードの数だけ入力を走査しても言うほど時間かからない気がする
0280デフォルトの名無しさん
2017/03/01(水) 07:58:17.12ID:ElQ6OcG3キーワードを予め文字単位でツリー化しておいて辿っていけば?
1文字読むたびに最大でもキーワードの最大文字数と同じ数だけのツリーのポインタを1歩進めるだけで済む
0281デフォルトの名無しさん
2017/03/01(水) 08:04:58.33ID:SJrJxNnQ> StreamReaderをCloseしようね
そこは using だろ
0282デフォルトの名無しさん
2017/03/01(水) 08:26:19.47ID:mkeal5qn0283デフォルトの名無しさん
2017/03/01(水) 14:31:13.79ID:UzmiTiReDomainのスコープを設定するにはどうすればいいでしょうか?
0284デフォルトの名無しさん
2017/03/01(水) 15:36:27.74ID:yuocqMDOまた、キーワード「こね・ねこ」があるとき、どちらに該当する?
0285デフォルトの名無しさん
2017/03/01(水) 17:28:21.57ID:9PjUMtQQフォームにボタンAとボタンBの二つのボタンがあります
ボタンAをクリックすると、ある反復処理が延々と繰り返されます
ボタンBをクリックしてこの反復処理をストップさせるには通常どのような記述をするのでしょうか
0286デフォルトの名無しさん
2017/03/01(水) 17:33:43.62ID:kRYqKFSr反復処理の中に条件付き中断処理を入れる
もう一つのボタンを押したときに中断処理用のフラグをセットする
もちろん別スレッドじゃないとボタン押せないけど
0287デフォルトの名無しさん
2017/03/01(水) 17:36:44.01ID:kRYqKFSr反復処理中にApplication.DoEvents入れてもボタンの入力受けるけど
反応悪くなるし、今時はまず使わないだろうな
0288デフォルトの名無しさん
2017/03/01(水) 19:13:43.54ID:1ptPBH8rCancellationTokenSource cancellationTokenSource;
async buttonA_Click()
{
this.cancellationTokenSource = new CancellationTokenSource();
while ( this.cancellationTokenSource.Token.IsCancellationRequested )
{
await Task.Run( () =>
{
// 何か
}, this.cancellationTokenSource.Token );
}
}
private void buttonB_Click()
{
this.cancellationTokenSource.Cancel();
}
0289デフォルトの名無しさん
2017/03/01(水) 19:21:54.77ID:z3LIBqaM0290デフォルトの名無しさん
2017/03/01(水) 19:31:02.44ID:CFmNTLskソース上げたら誰かみてくれるよ
0291デフォルトの名無しさん
2017/03/01(水) 19:53:57.57ID:SJrJxNnQ0292デフォルトの名無しさん
2017/03/01(水) 20:31:55.65ID:r70GDLNPnot Defined
0293デフォルトの名無しさん
2017/03/01(水) 21:37:40.58ID:PGtJZLdC「At2chLib」が使用できなくなってて困っています。
なにか良いライブラリとか有りますか?
0294デフォルトの名無しさん
2017/03/01(水) 21:39:56.43ID:PR7YLHWZ0295デフォルトの名無しさん
2017/03/01(水) 21:46:15.04ID:RAuT14LS0296デフォルトの名無しさん
2017/03/01(水) 22:01:49.72ID:r70GDLNP0297デフォルトの名無しさん
2017/03/01(水) 22:08:23.90ID:PGtJZLdC0298デフォルトの名無しさん
2017/03/01(水) 22:31:30.38ID:78O8EuSm0299デフォルトの名無しさん
2017/03/01(水) 22:38:28.52ID:fB20izlq違法だったら良いのにな…
もし違法だったらVIPで埋めまくってる奴逮捕されていなくなるはずなのにな…
はぁ…
0300デフォルトの名無しさん
2017/03/01(水) 23:00:18.14ID:U2Od4VRx0301デフォルトの名無しさん
2017/03/01(水) 23:13:49.83ID:fB20izlq0302デフォルトの名無しさん
2017/03/01(水) 23:57:19.29ID:6tJnN0su1処理1個挟むんじゃなくて100処理か1000処理に1回ぐらいでお願いします
0303デフォルトの名無しさん
2017/03/02(木) 00:33:44.50ID:IBdXO0OOどこが遅いか分析が足りてないな
キーワードにヒットしたら番地とヒットしたキーワード格納して置換はしないでみたら?
置換って頭使わないと最悪な方法で処理してくれてる気がする
abcを見つけたらdefghijkに変換してくれる処理って
c言語だったら変換後の配列のサイズの計算からしなきゃいけないわけで
それをc#ってreplaceしやがったら配列の再確保余裕でしたみたいなことするアホだろ
その辺は考慮に入ってる?
0304デフォルトの名無しさん
2017/03/02(木) 00:54:02.49ID:FuaoIGJx0305デフォルトの名無しさん
2017/03/02(木) 00:54:51.19ID:IBdXO0OOstr1 + str2
みたいなことするとこれも合体後の文字列の長さで配列を再確保する
3万文字もある文字列だと1回文字列連結をするだけでヤバイ
変換に使用するキーワードの使用回数から最終的な文字列の長さを算出する必要があるかも
ってそれも考慮済みだろうか?
0306デフォルトの名無しさん
2017/03/02(木) 00:58:24.20ID:FuaoIGJx0307デフォルトの名無しさん
2017/03/02(木) 01:07:45.83ID:B13E3oAw0308デフォルトの名無しさん
2017/03/02(木) 01:09:29.82ID:FuaoIGJxstringは糞遅い。
だからMSは最初から別のクラスを用意してる。ググレカスども。
0309デフォルトの名無しさん
2017/03/02(木) 01:14:29.76ID:oXaAut0o0310デフォルトの名無しさん
2017/03/02(木) 01:18:09.17ID:iFkNWUjshttps://referencesource.microsoft.com/#mscorlib/system/text/stringbuilder.cs,1485
https://referencesource.microsoft.com/#mscorlib/system/text/stringbuilder.cs,1535
0311デフォルトの名無しさん
2017/03/02(木) 01:20:26.39ID:iFkNWUjsReplaceのパフォーマンスはそんな変わらないよ
ググレカス
0312デフォルトの名無しさん
2017/03/02(木) 01:22:58.33ID:o9lMs6ta0313デフォルトの名無しさん
2017/03/02(木) 01:23:22.99ID:FuaoIGJx最後のヒントな。
大山札
0314デフォルトの名無しさん
2017/03/02(木) 02:04:51.98ID:ggH8M0CBもしかしてあらかじめ領域を準備して,自分で足していく,とか‥
0315デフォルトの名無しさん
2017/03/02(木) 02:30:07.47ID:4HioNM+3違法と犯罪は違うぞ
0316デフォルトの名無しさん
2017/03/02(木) 02:41:55.30ID:iFkNWUjs>>280
0317デフォルトの名無しさん
2017/03/02(木) 06:45:07.41ID:JZiPjSZc>>280のアルゴリズムで実装したら100倍とかのオーダーで速くなるはず
0318デフォルトの名無しさん
2017/03/02(木) 07:40:36.76ID:WqhQkxL/実装して計測してコードと計測結果を晒してから主張して
0319デフォルトの名無しさん
2017/03/02(木) 07:52:06.73ID:Ct6l/xwh280は検索で遅いとき
置換で遅いときはstringbuilderをキッチリサイズ指定する方法でやらないとダメ
まず切り分けかな?
0320デフォルトの名無しさん
2017/03/02(木) 08:49:47.79ID:oX3M/pPf圧倒的に検索の問題になるだろうね
普通は
0321デフォルトの名無しさん
2017/03/02(木) 09:05:00.59ID:Ct6l/xwhいや3万文字を置換のたびに1回1回stringのreplaceしてたらその度に3万文字分の配列を再確保
これが致命的
stringのreplaceはやってはならない
stringbuilderで
これも使い方悪いと速度出ないので正しい感じで
0322デフォルトの名無しさん
2017/03/02(木) 09:06:59.45ID:Ct6l/xwh0323デフォルトの名無しさん
2017/03/02(木) 09:07:18.82ID:cjA1b3op終端ノードまで来たら開始インデックスから後を削除し、終端ノードに持たせてある置換文字列を付加し、現在のツリーポインタを全て破棄
こうすれば280で置換も効率的にやれるよ
0324デフォルトの名無しさん
2017/03/02(木) 09:17:20.56ID:cjA1b3opそれ文字列が長ければreplaceのための線形探索がネックになるはずで、StringBuilderは直接関係ないでしょ
簡単に効率を改善するんなら、全キーワードのうち最長のキーワードの文字数と同じサイズのバッファを持っといて
そこに対して置換をかけりゃいい
もちろんその置換結果を最終出力の文字列として連結していくところはStringBuilderを使うべきだけど
0325デフォルトの名無しさん
2017/03/02(木) 10:02:53.43ID:xcfTeAxlに限定されると思ふ ノ ヽ(・ω・)/ズコー
0326デフォルトの名無しさん
2017/03/02(木) 12:13:19.52ID:63yIksCz0327デフォルトの名無しさん
2017/03/02(木) 13:30:45.83ID:NvG2Ox0H一万近いとどうなんだろうか
0328デフォルトの名無しさん
2017/03/02(木) 13:39:24.58ID:Ct6l/xwh置換後に短くなっても駄目っぽいけどね
0329デフォルトの名無しさん
2017/03/02(木) 13:42:21.47ID:j0RdOmJSで方法変えた方がいいな
0330デフォルトの名無しさん
2017/03/02(木) 16:45:48.51ID:yzi1qiN6そんな変な処理をしなければいいだろ。
解決!
0331デフォルトの名無しさん
2017/03/02(木) 19:36:05.41ID:tOCPWbBv0332デフォルトの名無しさん
2017/03/02(木) 19:43:30.86ID:j0RdOmJS0333デフォルトの名無しさん
2017/03/02(木) 19:47:35.64ID:eNjjKtZ0それ以前にベタにやっても余裕だと思うが。
0334デフォルトの名無しさん
2017/03/02(木) 19:54:31.82ID:Ct6l/xwhプロファイラ使えるようになるのが一番いいね
ただ、それじゃわかりにくいときもあるから知恵をつけるのも大事だと思う
0335デフォルトの名無しさん
2017/03/02(木) 20:14:46.47ID:eNjjKtZ0例えばString.Replaceと出て終わり。
https://msdn.microsoft.com/ja-jp/library/ms182372.aspx
https://msdn.microsoft.com/ja-jp/library/fk49wtc1(v=vs.110).aspx
その先の解像度は一般的に無いでしょ。(俺はC#のプロファイラを使ったことは無い)
だからここでやってるみたいにCLR内の動作を考える必要がある。
0336デフォルトの名無しさん
2017/03/02(木) 20:23:23.74ID:j0RdOmJSそれはプロファイラの考え方を間違ってる(使ってないみたいだから知らないのは当然かもしれんが)
replaceがネックって出ればそれでいいんだよ
0337デフォルトの名無しさん
2017/03/02(木) 20:34:59.52ID:Ct6l/xwhそうだね
さらにgoogleで
replace 遅い c#
なんてキーワードで検索かければもう解決方法も見つかったようなもんだね
0338デフォルトの名無しさん
2017/03/02(木) 20:42:38.33ID:eNjjKtZ0いや俺は他言語(JavaScript)ではプロファイラ使いまくりだぞ。
そしてプロファイラ自体は見た目ほぼ同じだし。当たり前だが。
というか今回は20行程度のプログラムで2重ループするだけだろ。
ベタでやった場合、String.Replaceが出るに決まってるだろ。
お前はアホの子か?
問題はそれをどう変えたらどう改善されるかの見通しを立てることだろ。
それはここでみんながやってるように、自分で考えないと分からない。
とはいえここで案を出してもらってるんだし、後はがんばれでしかないが。
0339デフォルトの名無しさん
2017/03/02(木) 20:44:03.61ID:maE+uJIv馬鹿は一生js書いてろ
くせえから出歩くなクソが
0340デフォルトの名無しさん
2017/03/02(木) 20:49:46.45ID:rlmCwDYA品質の悪いライブラリと品質の悪い人材によって書かれているから
すぐsucks so muchになるんだ
0341デフォルトの名無しさん
2017/03/02(木) 21:44:03.77ID:eNjjKtZ0いやJavaScriptはJITがエグイからでしょ。(同じ傾向はC#にもあるはずだが)
例えばHTMLの特殊文字を変更する場合、string.replace(Regex,func)で纏めるよりも、
数個なら string.replace().replace().replace() とかハードコードした方が速かったりする。
ボトルネックがソースから予測しづらいからプロファイラを使うしかない。
その点、Cは最初から見えた状態で書くからいい。
ただこのあっさり感、C#ならString, StringBuilder, Regexで試して、
それ以上は諦める文化なのかもしれんね。そういう用途の言語ではあるし。
C的アプローチで限界速度を追求するのではなくてね。
0342デフォルトの名無しさん
2017/03/03(金) 07:07:46.01ID:GM13pkfIろくな解決策が出ないので
もう結構です
0343デフォルトの名無しさん
2017/03/03(金) 07:16:35.43ID:cZXazyZL文字列探索アルゴリズムの問題だと思うのは俺だけかな?
そこを自前で実装すれば高速化できると思うのだけど
0344デフォルトの名無しさん
2017/03/03(金) 07:22:10.27ID:4qcBtzljそれは>>280で出てる
0345デフォルトの名無しさん
2017/03/03(金) 07:22:40.42ID:cZXazyZL置き換え後、どこに格納するかはたいして重要じゃないはず。
状況に応じた探索アルゴリズムを使用することが重要。
自前実装は辛いけど。
0346デフォルトの名無しさん
2017/03/03(金) 07:31:45.18ID:ELiKOyhw0347デフォルトの名無しさん
2017/03/03(金) 07:34:13.74ID:4qcBtzljその「状況」は単純に探索をどうするかだけではないよ
置換処理に適したアルゴリズムを使用することが重要
その意味ではトライ木を使った方法(280)はリアルタイムで読んだそばから置換できるから目的に合ってる
0348デフォルトの名無しさん
2017/03/03(金) 07:50:58.21ID:pVtcQ1mY0349デフォルトの名無しさん
2017/03/03(金) 07:54:40.78ID:a7lwSDS40350デフォルトの名無しさん
2017/03/03(金) 07:56:17.33ID:pVtcQ1mY0351デフォルトの名無しさん
2017/03/03(金) 08:06:18.44ID:hxiWJWmX検索された文字列から変換後の文字列を求める手間の話?
8,200個くらいならたいしたことないと思う
0352デフォルトの名無しさん
2017/03/03(金) 08:19:11.00ID:ELiKOyhw0353デフォルトの名無しさん
2017/03/03(金) 08:30:26.60ID:LqKyLlg1できるのわかってるし
正直、対象の文字列に対してdictionaryでまとめてある群からヒットさせるならそこまで変わらないと俺は思ってるので興味ない
さらに話題提供者は明確な仕様を出したわけではないので現状では「組めない」が正解
さらにこの問題は対象のデータの持ち方で解決する方法もあって多くの場合そっちのほうが楽なので
あまりこのスレで出たような解決方法を適用することは無いかも
0354デフォルトの名無しさん
2017/03/03(金) 08:56:05.96ID:LqKyLlg1キーワードが改行を含まないのであれば
行ごとにreplace処理して文字列の統合だけstringbuilderを使えばこれだけで十分な速度が出ると思われる
(1行300文字程度と想定)
とかね
僕のカコイイスペシャルエディタでも作らない限りはフォーマット自体に特有の癖があるもんで
大抵の場合は独自の解決方法を考えたほうが早い
0355デフォルトの名無しさん
2017/03/03(金) 09:35:42.12ID:velk9AIH0356デフォルトの名無しさん
2017/03/03(金) 13:45:46.60ID:hf3TFoOqUNIXのShellのコマンド解析の実装がそんな感じ。
ただしスイッチ文の嵐だが(一文字目がCならCPを検査とか・・・
0357デフォルトの名無しさん
2017/03/03(金) 15:59:24.43ID:GTe30Tvn1ファイルの文字数がやたら少ないし何の目的か全くわからんかった
>>346,352がアフィ本人だね
0358デフォルトの名無しさん
2017/03/03(金) 16:00:23.77ID:GTe30Tvn>>342,346,352がアフィ本人
0359デフォルトの名無しさん
2017/03/03(金) 16:00:55.70ID:oAXP4RlZアホの子なの?
0360デフォルトの名無しさん
2017/03/03(金) 16:02:40.13ID:nP8cPyWm0361デフォルトの名無しさん
2017/03/03(金) 16:54:07.87ID:Loi48FLt0362デフォルトの名無しさん
2017/03/03(金) 17:00:38.87ID:nP8cPyWm■ このスレッドは過去ログ倉庫に格納されています