C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: 非常に時間がかかります


(過去ログ 37 を表示中)

[トピック内 20 記事 (1 - 20 表示)]  << 0 >>

■19089 / inTopicNo.1)  非常に時間がかかります
  
□投稿者/ hi (1回)-(2008/05/20(Tue) 11:09:53)

分類:[C#] 

使用言語はC# XPで開発しています。
C#を先月からはじめて、現在以下のソースでマシン名のチェックをしているのですが、
時間が非常にかかってしまいます。以下の部分で何か改善点を教えていただけたらと思いまして投稿しました。
宜しくお願い致します。

public static bool CheckMachineName()
{
if (new Quest05B().MachineName.Length <= 0)
return false;
if (new Quest05B().MachineName.Length > 30)
return false;
if (new Quest05B().MachineName.Equals("ErrorName"))
return false;
for (int i = 0; i < 10; i++)
{
string name = new Quest05B().MachineName;
}
return true;
}

class Quest05B
{
/// <summary>
/// マシン名取得
/// </summary>
/// <returns></returns>
public string MachineName
{
get
{
return GetMyMachineName();
}
}

/// <summary>
/// マシン名取得
/// </summary>
/// <returns></returns>
private static string GetMyMachineName()
{
System.Threading.Thread.Sleep(1000);
return Environment.MachineName;
}
引用返信 編集キー/
■19091 / inTopicNo.2)  Re[1]: 非常に時間がかかります
□投稿者/ れい (556回)-(2008/05/20(Tue) 11:15:27)
System.Threading.Thread.Sleep(1000);
を取りましょう。

引用返信 編集キー/
■19094 / inTopicNo.3)  Re[2]: 非常に時間がかかります
□投稿者/ hi (2回)-(2008/05/20(Tue) 11:32:48)
No19091 (れい さん) に返信
> System.Threading.Thread.Sleep(1000);
> を取りましょう。
>
即回答ありがとうございます。
今変更したのですが、GetMyMachineName()とCheckMachineName()を変更した場合、他のロジックで
大きな修正が入らないといけない感じになってしまったのですが、プロパティのみの変更で早くなるってことは
ありますか?


引用返信 編集キー/
■19100 / inTopicNo.4)  Re[1]: 非常に時間がかかります
□投稿者/ シャノン (433回)-(2008/05/20(Tue) 11:46:51)
No19089 (hi さん) に返信

毎度毎度 new Quest5B() している意味はあるのですか?
一度 GetMachineName した結果を使いまわせそうな気がしますが。

あと、これ、GetMachineName のコードをそのまま載せています?
Environment.MachineName はエラー時に "ErrorName" なんて返さないと思いますけど。

for 文中で繰り返し GetMachineName しているのもなぜ?
引用返信 編集キー/
■19101 / inTopicNo.5)  Re[3]: 非常に時間がかかります
□投稿者/ επιστημη (1030回)-(2008/05/20(Tue) 11:47:10)
επιστημη さんの Web サイト
「System.Threading.Thread.Sleep(1000); を温存したままで」ということですか?
ならばGetMyMachineName()は最短でも1000ミリ秒かかりますが、それでいいのでしょうか?

引用返信 編集キー/
■19105 / inTopicNo.6)  Re[3]: 非常に時間がかかります
□投稿者/ れい (558回)-(2008/05/20(Tue) 12:18:01)
2008/05/20(Tue) 12:19:19 編集(投稿者)

No19094 (hi さん) に返信
> 即回答ありがとうございます。
> 今変更したのですが、GetMyMachineName()とCheckMachineName()を変更した場合、他のロジックで
> 大きな修正が入らないといけない感じになってしまったのですが、プロパティのみの変更で早くなるってことは
> ありますか?

もう何を言ってるのかさっぱり分からないわけですが、
プロパティの変更のみで早くしろ、というゲームと考えるなら、
・Environment.MachineNameは再起動まで変わらない
・再起動時にプロセスは死ぬ
という暗黙知と
・フィールドの追加はあり
・シングルスレッド
という仮定を使って

private static string _machinename;
public string MachineName {
get {
if ( _machinename == null ) _machinename = GetMyMachineName();
return machinename;
}
}

で約1秒まで早くできますが、
「だから何?」
というレベルですね。

2個の仮定なしでも出来なくはないですが、さらに意味不明になりますね。

追記。

もっと簡単でした。

public string MachineName {
get {
return Environment.MachineName;
}
}
引用返信 編集キー/
■19107 / inTopicNo.7)  Re[3]: 非常に時間がかかります
□投稿者/ はつね (715回)-(2008/05/20(Tue) 12:42:48)
はつね さんの Web サイト
No19094 (hi さん) に返信
> 今変更したのですが、GetMyMachineName()とCheckMachineName()を変更した場合、他のロジックで
> 大きな修正が入らないといけない感じになってしまったのですが、プロパティのみの変更で早くなるってことは
> ありますか?

変更していいのはどこになるのでしょうか?

引用返信 編集キー/
■19109 / inTopicNo.8)  Re[2]: 非常に時間がかかります
□投稿者/ hi (3回)-(2008/05/20(Tue) 12:55:04)
No19100 (シャノン さん) に返信
> ■No19089 (hi さん) に返信
>
> 毎度毎度 new Quest5B() している意味はあるのですか?
> 一度 GetMachineName した結果を使いまわせそうな気がしますが。
>
> あと、これ、GetMachineName のコードをそのまま載せています?
> Environment.MachineName はエラー時に "ErrorName" なんて返さないと思いますけど。

返信ありがとうございます。
ErrorNameは自分で書きました。すみません。

> for 文中で繰り返し GetMachineName しているのもなぜ?
共同で開発している先輩からの要求で行いました。
他のクラスで必要みたいです。


引用返信 編集キー/
■19110 / inTopicNo.9)  Re[3]: 非常に時間がかかります
□投稿者/ hi (4回)-(2008/05/20(Tue) 12:58:52)
No19109 (hi さん) に返信
> ■19101 (επιστημη さん) に返信
>>
> 「System.Threading.Thread.Sleep(1000); を温存したままで」ということですか?
> ならばGetMyMachineName()は最短でも1000ミリ秒かかりますが、それでいいのでしょうか?


GetMyMachineName()はなるべくいじりたくないので、温存したままで処理を行いたいです。




引用返信 編集キー/
■19111 / inTopicNo.10)  Re[4]: 非常に時間がかかります
□投稿者/ επιστημη (1031回)-(2008/05/20(Tue) 13:02:51)
επιστημη さんの Web サイト
>>ならばGetMyMachineName()は最短でも1000ミリ秒かかりますが、それでいいのでしょうか?
> GetMyMachineName()はなるべくいじりたくないので、温存したままで処理を行いたいです。

ならば10秒上乗せされているわけですが、現時点で実測すると何秒かかるんですか?
どうがんばっても10秒以下では無理ですが、それはわかってますよね?



引用返信 編集キー/
■19112 / inTopicNo.11)  Re[4]: 非常に時間がかかります
□投稿者/ hi (5回)-(2008/05/20(Tue) 13:03:19)
No 19105(れい さん) に返信
本当に申し訳ありません。
返信ありがとうございます。

追記。の記述だとなぜ早くなるのか質問させていただいてよろしいでしょうか?
すみません。知識不足で。
引用返信 編集キー/
■19113 / inTopicNo.12)  Re[5]: 非常に時間がかかります
□投稿者/ hi (6回)-(2008/05/20(Tue) 13:05:24)
No19111 (επιστημη さん) に返信
> >>ならばGetMyMachineName()は最短でも1000ミリ秒かかりますが、それでいいのでしょうか?
>>GetMyMachineName()はなるべくいじりたくないので、温存したままで処理を行いたいです。
>
> ならば10秒上乗せされているわけですが、現時点で実測すると何秒かかるんですか?
> どうがんばっても10秒以下では無理ですが、それはわかってますよね?
>

20秒近くかかっています。
10秒以下にできないのは承知しています。
引用返信 編集キー/
■19114 / inTopicNo.13)  Re[6]: 非常に時間がかかります
□投稿者/ επιστημη (1032回)-(2008/05/20(Tue) 13:10:59)
επιστημη さんの Web サイト
> 20秒近くかかっています。
> 10秒以下にできないのは承知しています。

private static string GetMyMachineName() {
System.Threading.Thread.Sleep(1000);
return Environment.MachineName;
}

↑こいつの呼び出しを極力減らせ。ですね。一度呼ぶたびに1秒かかります。
今のコードで何回呼び出してるか勘定しましたか?

引用返信 編集キー/
■19115 / inTopicNo.14)  Re[6]: 非常に時間がかかります
□投稿者/ ネタ好き (299回)-(2008/05/20(Tue) 13:12:49)
No19113 (hi さん) に返信
> ■No19111 (επιστημη さん) に返信
>>>>ならばGetMyMachineName()は最短でも1000ミリ秒かかりますが、それでいいのでしょうか?
> >>GetMyMachineName()はなるべくいじりたくないので、温存したままで処理を行いたいです。
>>
>>ならば10秒上乗せされているわけですが、現時点で実測すると何秒かかるんですか?
>>どうがんばっても10秒以下では無理ですが、それはわかってますよね?
>>
>
> 20秒近くかかっています。
> 10秒以下にできないのは承知しています。

あのぉ、一ついいですか?
遠隔地にあるマシンの名前を取得する場合、それだけ時間がかかるから、
「必ず」10秒以上20秒以下にするのは無理だと思います。
引用返信 編集キー/
■19117 / inTopicNo.15)  Re[7]: 非常に時間がかかります
□投稿者/ hi (8回)-(2008/05/20(Tue) 13:15:55)
No19114 (επιστημη さん) に返信
>>20秒近くかかっています。
>>10秒以下にできないのは承知しています。
>
> private static string GetMyMachineName() {
> System.Threading.Thread.Sleep(1000);
> return Environment.MachineName;
> }
>
> ↑こいつの呼び出しを極力減らせ。ですね。一度呼ぶたびに1秒かかります。
> 今のコードで何回呼び出してるか勘定しましたか?
>

そこのメソッドを変更するっていうのが、一番なんですよね。
何回呼んでいるか数えていません。すみません。
引用返信 編集キー/
■19118 / inTopicNo.16)  Re[8]: 非常に時間がかかります
□投稿者/ hi (9回)-(2008/05/20(Tue) 13:17:18)
No19115(ネタ好きさん) に返信

そうなんですか、ありがとうございます。
引用返信 編集キー/
■19119 / inTopicNo.17)  Re[5]: 非常に時間がかかります
□投稿者/ れい (560回)-(2008/05/20(Tue) 13:22:29)
No19112 (hi さん) に返信
> ■No 19105(れい さん) に返信
> 追記。の記述だとなぜ早くなるのか質問させていただいてよろしいでしょうか?

Sleep(1000)を呼ばないからです。

相変わらず何をしたいのかさっぱり分からないですよ。

コードが抜粋であるなら抜粋した部分にその旨の記述をしましょう。
目的がなんであるのか、理解して他人に分かるよう説明しましょう。

引用返信 編集キー/
■19121 / inTopicNo.18)  Re[9]: 非常に時間がかかります
□投稿者/ PATIO (69回)-(2008/05/20(Tue) 13:40:12)
まず、自分が提示しているコードの内容をちゃんと理解しないと
修正するにしても無理です。
何処をいじってもよくて何処はだめなのか自分で判定が出来ませんから。
掲示板を読んでいる人はその辺の判断をする事ができないのですから
貴方が判断できないと話が進みません。

ネタ好きさんも書かれていますけれど、ネットワークを介した場合は
そのネットワークの状況(込み具合とかルーティングの状況とか)によって
時間は変わると思いますのでまずは、何処がボトルネックになっているのかを
調べるべきでしょう。
それがわかって初めて手を入れて改善できるのか等の判断になると思います。

個人的な意見ですが、
会社とかならまず社内で解決する努力をするのが筋かと思います。
社内の人もわからないと言うなら話は別ですが、
まずは内部で解決をはかるのが本当ではないかと。


引用返信 編集キー/
■19127 / inTopicNo.19)  Re[6]: 非常に時間がかかります
□投稿者/ はつね (716回)-(2008/05/20(Tue) 14:11:28)
はつね さんの Web サイト
>>追記。の記述だとなぜ早くなるのか質問させていただいてよろしいでしょうか?
>
> Sleep(1000)を呼ばないからです。

問題点を列挙してみます。
・なんでSleep(1000)が必要なのかが示されたコードからは判断できないし、通常はいらないはず
・例示されたコードでSleep(1000)以外に時間の掛かりそうな処理が見当たらない

私を含めた回答者の結論:
例示されたコードを早くしようと思ったらSleep(1000)のコードを削除するかGetMyMachineNameを
呼ばないように書き換えるくらいしかなさそう。

スレ主の反応:
早くしたいです⇒問題点列挙に戻る

こんなループになっている感じで、新たな判断材料がでてこないと、堂々巡りな気がします。

引用返信 編集キー/
■19142 / inTopicNo.20)  Re[10]: 非常に時間がかかります
 
□投稿者/ hi (10回)-(2008/05/20(Tue) 14:40:59)
皆様自分の理解不足で、説明ができずすみません。

GetMyMachineNameを呼ばれないようにするということで、早くなったのでありがとうございます。
今後質問する際は、理解をしてから質問をしたいと思います。

皆様、ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -