ソフトとパーフォマンスの関係
ソフトとパーフォマンスの関係
「 ぼ・や・き つ・ぶ・や・き 」
前からこちらのサイトも時々見ながらソフトを造ってみています。投稿には慣れていません。
私はレベルが低くて、恥ずかしくて質問も出来ず悶々としていました。
現在のソフトは、組み込み系の監視、データベース用に製作途上です。
ソフトは24時間、年中動かしている停止させないソフトです。
PCは Win VISTA VC++(2008 Standard) でのコンソールアプリです。
ソフトを動かしているとパソコンの動きが段々落ちてきたような気がしているのでタスクマネージャーを起動して確認してみました。
その数値は CPU使用率 ほとんど100%時々 ハードデスクが動いている。
物理メモリー 合計1013MB
キャッシュ済み 371
空きメモリー 8
カーネルメモリ 合計125 MB
ページ 72
非ページ 52 ・・・・・・・
システム
ハンドル 20441
スレッド 806
プロセス 76
ページファイル 1332M/2290M
リソースモニターを見てもCPUが100%近くである事以外何の事かよく分りません。
プログラムのソースで気になるのは配列に大きいものが設けてあります。
float XXX [8][21600];
これより大きな配列を設けると、スタックオーバフロー・・・とか訳の分らないメーっセージがてしまいます。
その為、配列にデータを書き終えると内容をハードデスクに移し再度書き換えています。
皆さんはパソコンを、どの様な環境、CPU負荷でお使いでしょうか。
メモリーの増設もしたくないと思いますし効果の程も分りません。
前からこちらのサイトも時々見ながらソフトを造ってみています。投稿には慣れていません。
私はレベルが低くて、恥ずかしくて質問も出来ず悶々としていました。
現在のソフトは、組み込み系の監視、データベース用に製作途上です。
ソフトは24時間、年中動かしている停止させないソフトです。
PCは Win VISTA VC++(2008 Standard) でのコンソールアプリです。
ソフトを動かしているとパソコンの動きが段々落ちてきたような気がしているのでタスクマネージャーを起動して確認してみました。
その数値は CPU使用率 ほとんど100%時々 ハードデスクが動いている。
物理メモリー 合計1013MB
キャッシュ済み 371
空きメモリー 8
カーネルメモリ 合計125 MB
ページ 72
非ページ 52 ・・・・・・・
システム
ハンドル 20441
スレッド 806
プロセス 76
ページファイル 1332M/2290M
リソースモニターを見てもCPUが100%近くである事以外何の事かよく分りません。
プログラムのソースで気になるのは配列に大きいものが設けてあります。
float XXX [8][21600];
これより大きな配列を設けると、スタックオーバフロー・・・とか訳の分らないメーっセージがてしまいます。
その為、配列にデータを書き終えると内容をハードデスクに移し再度書き換えています。
皆さんはパソコンを、どの様な環境、CPU負荷でお使いでしょうか。
メモリーの増設もしたくないと思いますし効果の程も分りません。
Re: ソフトとパーフォマンスの関係
関数内に書くとスタック領域に格納されるのでそんなに大きい配列は確保できません
動的確保、staticを付けるかグローバル変数にしてみるといいでしょう
動的確保、staticを付けるかグローバル変数にしてみるといいでしょう
Re: ソフトとパーフォマンスの関係
ハードディスク( harddisk )が正しい。デスクトップ( desktop )と混ざってませんか ?
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。
中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。
中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。
Re: ソフトとパーフォマンスの関係
Windows環境において、自動変数はスタック領域に配置されますが、スタック領域に670KiBもの領域を確保しようとしても、足りないと思います。
roxion1377さんの仰るとおり、静的変数,グローバル変数,or 動的確保(malloc)を使えばいいと思いますが、メモリリークには気をつけてください。
ソフトのパフォーマンス低下の原因は、もしかするとリソースリークである可能性があります。常時起動しているソフトであるならば、できる限りこまめにリソースを解放するようにしないと、リーク量がどんどん増えていきます。
roxion1377さんの仰るとおり、静的変数,グローバル変数,or 動的確保(malloc)を使えばいいと思いますが、メモリリークには気をつけてください。
ソフトのパフォーマンス低下の原因は、もしかするとリソースリークである可能性があります。常時起動しているソフトであるならば、できる限りこまめにリソースを解放するようにしないと、リーク量がどんどん増えていきます。
Re: ソフトとパーフォマンスの関係
皆さんの言われることは参考にします。
ハードデイスクでしたね。カナ変換が・・・
float XXX [8][21600]; これは本当は
float XXX [8][86400]; としたかった。
要するに一秒間に一回のデータを9チャンネル一日分(60*60*24)をハードデイスクに毎日落とすつもりでした。
フロートでなく、バイナリーで自動的に落す手もありますが何れにしても、問題があります。
配列の宣言は関数の中ではなく外部にしてもエラーがでました。
もっと、こまめに自動で落せば配列を小さく出来ますが、他の作業に遅れがでるので問題です。
そしてハードデイスクの耐久性も疑問があります。
>メモリリークには気をつけてください。
発見など難しいですね。
私の場合、リソースの開放が出来ない状況?です。
ハードデイスクでしたね。カナ変換が・・・
float XXX [8][21600]; これは本当は
float XXX [8][86400]; としたかった。
要するに一秒間に一回のデータを9チャンネル一日分(60*60*24)をハードデイスクに毎日落とすつもりでした。
フロートでなく、バイナリーで自動的に落す手もありますが何れにしても、問題があります。
配列の宣言は関数の中ではなく外部にしてもエラーがでました。
もっと、こまめに自動で落せば配列を小さく出来ますが、他の作業に遅れがでるので問題です。
そしてハードデイスクの耐久性も疑問があります。
>メモリリークには気をつけてください。
発見など難しいですね。
私の場合、リソースの開放が出来ない状況?です。
Re: ソフトとパーフォマンスの関係
ここは主にゲーム関係なんで他の専門的なところで質問したほうがいいような気がします
もちろん、ここの方のレベルが低いということではなく
適切なアドバイスがいただけるのではないのかなと思っています
ハードウェアからみもあるようで
いろいろ検証用ツールなども導入する必要があるのでは?と思いますが
三郎さんの予算や時間しだいかなと思ってます
別にここでやるなといってるわけではないです(私の掲示板ではないので)
ソフトとパフォーマンスの問題となると
ハードウェアの性能、対応している命令群や、並列処理の対応、CPUの数、メモリの種類
プログラムの組み方の問題などなど、考慮することがとても多いです
もちろん、ここの方のレベルが低いということではなく
適切なアドバイスがいただけるのではないのかなと思っています
ハードウェアからみもあるようで
いろいろ検証用ツールなども導入する必要があるのでは?と思いますが
三郎さんの予算や時間しだいかなと思ってます
別にここでやるなといってるわけではないです(私の掲示板ではないので)
ソフトとパフォーマンスの問題となると
ハードウェアの性能、対応している命令群や、並列処理の対応、CPUの数、メモリの種類
プログラムの組み方の問題などなど、考慮することがとても多いです
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: ソフトとパーフォマンスの関係
float XXX [8][21600]
であっても600KB程度で
float XXX [8][86400];
でも2.7MB程度です。
なので、staticに確保すれば足らないメモリではありません。
別の問題ではないでしょうか?
それよりも、実メモリがどのぐらい使われているかが気になります。
パフォーマンスタブの実際に使われている物理メモリの使用量(グラフの横に表示)とリソースモニタで問題のアプリが使用しているコミットメモリ量はいくつなのでしょうか?
「タスク・マネージャのパフォーマンス・タブの見方(Windows Vista/Windows Server 2008編) - @IT」
http://www.atmarkit.co.jp/fwin2k/win2kt ... taskv.html
「リソース・モニタでメモリの利用状況をモニタする - @IT」
http://www.atmarkit.co.jp/fwin2k/win2kt ... smonp.html
であっても600KB程度で
float XXX [8][86400];
でも2.7MB程度です。
なので、staticに確保すれば足らないメモリではありません。
別の問題ではないでしょうか?
それよりも、実メモリがどのぐらい使われているかが気になります。
パフォーマンスタブの実際に使われている物理メモリの使用量(グラフの横に表示)とリソースモニタで問題のアプリが使用しているコミットメモリ量はいくつなのでしょうか?
「タスク・マネージャのパフォーマンス・タブの見方(Windows Vista/Windows Server 2008編) - @IT」
http://www.atmarkit.co.jp/fwin2k/win2kt ... taskv.html
「リソース・モニタでメモリの利用状況をモニタする - @IT」
http://www.atmarkit.co.jp/fwin2k/win2kt ... smonp.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: ソフトとパーフォマンスの関係
ソフト屋さん情報有難うございました助かりました。
今までパーフォマンスモニターを只、呆然と見ていました。どうせ専門家以外の、我々には分らないものと諦めていました。
貴殿の情報のリンクを辿ってみると詳しく解説が載っておりました。
原因を追究すべく調べてみます。何せ恥ずかしながら独学、あやふやな知識、最高齢ですが挑戦してみます。
物理メモリーの空きメモリーが少なく、ソフトを動かしてみましたら殆ど無くなってしまいます。
いつの間に、何にこんなにメモリーを使っていたのだろうと唖然としました。
>なので、staticに確保すれば足らないメモリではありません。
私は今まで関数の外で配列を宣言すればそれでよいと思っていました。
貴殿の指摘どうり 頭にstaticの6文字を付け加えるだけで全て解決しました。
このために何年間苦しんだか分りません!。
貴殿には重ねて感謝を申し上げます。
一旦解決とさせていただきます。
今までパーフォマンスモニターを只、呆然と見ていました。どうせ専門家以外の、我々には分らないものと諦めていました。
貴殿の情報のリンクを辿ってみると詳しく解説が載っておりました。
原因を追究すべく調べてみます。何せ恥ずかしながら独学、あやふやな知識、最高齢ですが挑戦してみます。
物理メモリーの空きメモリーが少なく、ソフトを動かしてみましたら殆ど無くなってしまいます。
いつの間に、何にこんなにメモリーを使っていたのだろうと唖然としました。
>なので、staticに確保すれば足らないメモリではありません。
私は今まで関数の外で配列を宣言すればそれでよいと思っていました。
貴殿の指摘どうり 頭にstaticの6文字を付け加えるだけで全て解決しました。
このために何年間苦しんだか分りません!。
貴殿には重ねて感謝を申し上げます。
一旦解決とさせていただきます。
Re: ソフトとパーフォマンスの関係
サンプリングデータをファイルに書き出しているあいだ、サンプリングが中断しないようにマルチスレッドを使っていたりはしないですか?
その場合、内部変数にstaticを付けたらファイルに書き出される前にデータが上書きされてしまうと思います。
杞憂であれば良いですが。
あとウインドウズが頻繁にページファイルを読み書きするほうがハードディスクを酷使することになると思います。
その場合、内部変数にstaticを付けたらファイルに書き出される前にデータが上書きされてしまうと思います。
杞憂であれば良いですが。
あとウインドウズが頻繁にページファイルを読み書きするほうがハードディスクを酷使することになると思います。
Re: ソフトとパーフォマンスの関係
ISLeさんの言われるハードデイスクに書き出している間の処理について、とりあえずその間、数秒?くらいデータが欠落するようにしようと思います。
そしてソフトが使用できるようになってから、この問題を考えようと思います。
昼間のデータは重要ですから、夜間0時頃にデイスクに落そうと思っています。
データはA/D変換器で1チャンネルの変換速度は30μsecですからかなり余裕があります。
その為SN比を改善するする為に移動平均法、若しくは単純平均でデータ採取数を増やそうとも思っています。
調査してみましたら現在物理メモリの空きが10MBほどしかなくこのソフトで大半を使うので空きを増やす事を考えています。
環境をタスクマネージャで調べると実行中のプロセスがいつの間にか97に達っしていました。
そしてスタートアップに組み込まれているものが28もありました。
これを機会に、これらを整理して環境を改善してみようと思いました。そうすればハードデイスクの酷使も避けられるかと。
よい勉強をさせてもらいました。
そしてソフトが使用できるようになってから、この問題を考えようと思います。
昼間のデータは重要ですから、夜間0時頃にデイスクに落そうと思っています。
データはA/D変換器で1チャンネルの変換速度は30μsecですからかなり余裕があります。
その為SN比を改善するする為に移動平均法、若しくは単純平均でデータ採取数を増やそうとも思っています。
調査してみましたら現在物理メモリの空きが10MBほどしかなくこのソフトで大半を使うので空きを増やす事を考えています。
環境をタスクマネージャで調べると実行中のプロセスがいつの間にか97に達っしていました。
そしてスタートアップに組み込まれているものが28もありました。
これを機会に、これらを整理して環境を改善してみようと思いました。そうすればハードデイスクの酷使も避けられるかと。
よい勉強をさせてもらいました。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: ソフトとパーフォマンスの関係
素朴な疑問ですが、
float XXX [8][86400];
程度のワークメモリしか必要のないアプリが一体何MBのメモリを占有しているのでしょうか?
実行プログラムの専有メモリが10MB以上なのであれば、それはそれでなにか問題があります。
【追記】コンソールアプリですから5MBもあれば十分大きいと思います(大きなメモリを必要とするライブラリを使用していれば別ですが)。
もし、他にも大きなワークメモリがあるのなら、そこから見直された方が良いと思います。
それと書き出しにスレッドを使用すればデータのサンプリングを中断する必要もないと思うのですが使用されていないのでしょうか?
float XXX [8][86400];
程度のワークメモリしか必要のないアプリが一体何MBのメモリを占有しているのでしょうか?
実行プログラムの専有メモリが10MB以上なのであれば、それはそれでなにか問題があります。
【追記】コンソールアプリですから5MBもあれば十分大きいと思います(大きなメモリを必要とするライブラリを使用していれば別ですが)。
もし、他にも大きなワークメモリがあるのなら、そこから見直された方が良いと思います。
それと書き出しにスレッドを使用すればデータのサンプリングを中断する必要もないと思うのですが使用されていないのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: ソフトとパーフォマンスの関係
やっと、タスクマネージャとリソースモニターの見方が分りつつあるので今見ると。
ソフトを動かした状態でメモリーは826MBで合計の1013MBに比べて未だ余裕があるみたいです。
そしてリソースを見ると、アプリのコミットの値は876KBです。
それ程メモリーを使っていないように思いますが、このアプリを動かすとCPUの使用率が100%に達して下がりません。
ソースコードは現在800行ぐらいで、アプリの大きさは20KBぐらいの小さいものですが。
CPUの負荷はハードのA/D変換器が大半食っていると思います。A/D変換器の部分はメーカのソフトを流用し私の作っているものと合体し完成させるつもりです。
現在、デバッカーの使い方も熟知しておらず、田舎ではソフトについて聞く人も見つからず大変なのです。
マルチスレッドの技術など全く経験がありません。
25年位前にMSDOSでMSCを使い、似たようなソフトを造った経験はありますがWinの経験は全くありません。
そのときはシーケンシャルファイルとランダムアクセスファイルの経験はありますが、今回のような2次元配列を渡すのは初めてで、その部分の作成の準備中ですが早くも暗雲がたれて来ています。
なおメモリーは今後の事もありプラス、1GB増設しようかとも考えています。
ソフトを動かした状態でメモリーは826MBで合計の1013MBに比べて未だ余裕があるみたいです。
そしてリソースを見ると、アプリのコミットの値は876KBです。
それ程メモリーを使っていないように思いますが、このアプリを動かすとCPUの使用率が100%に達して下がりません。
ソースコードは現在800行ぐらいで、アプリの大きさは20KBぐらいの小さいものですが。
CPUの負荷はハードのA/D変換器が大半食っていると思います。A/D変換器の部分はメーカのソフトを流用し私の作っているものと合体し完成させるつもりです。
現在、デバッカーの使い方も熟知しておらず、田舎ではソフトについて聞く人も見つからず大変なのです。
マルチスレッドの技術など全く経験がありません。
25年位前にMSDOSでMSCを使い、似たようなソフトを造った経験はありますがWinの経験は全くありません。
そのときはシーケンシャルファイルとランダムアクセスファイルの経験はありますが、今回のような2次元配列を渡すのは初めてで、その部分の作成の準備中ですが早くも暗雲がたれて来ています。
なおメモリーは今後の事もありプラス、1GB増設しようかとも考えています。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: ソフトとパーフォマンスの関係
A/D変換自体はハードウェアでしょうから、ソフト側でこんなに負荷が必要な理由にはならないと思います。それ程メモリーを使っていないように思いますが、このアプリを動かすとCPUの使用率が100%に達して下がりません。
ソースコードは現在800行ぐらいで、アプリの大きさは20KBぐらいの小さいものですが。
CPUの負荷はハードのA/D変換器が大半食っていると思います。A/D変換器の部分はメーカのソフトを流用し私の作っているものと合体し完成させるつもりです。
データサンプリング周期などは分からないですが、全力でタイミング待ちループなんかしていませんか?
・SleepでCPUの解放などはしているか?
・イベント待ちなどでCPUを解放しているか?
・データ・サンプリング周期は、どのぐらいですか?
なにか無駄に負荷をかけている気がしてなりません。
プロでも大半の事は聞くことに恵まれる機会などまず有りませんよ。現在、デバッカーの使い方も熟知しておらず、田舎ではソフトについて聞く人も見つからず大変なのです。
マルチスレッドの技術など全く経験がありません。
書籍やサイトを調べて自力で解決するのが普通です。
マルチスレッドを使わなくても非同期ファイルアクセスで解決する可能性もあります。
ループの回し方の問題で、1次元でも2次元でも大差はありませんよ。25年位前にMSDOSでMSCを使い、似たようなソフトを造った経験はありますがWinの経験は全くありません。
そのときはシーケンシャルファイルとランダムアクセスファイルの経験はありますが、今回のような2次元配列を渡すのは初めてで、その部分の作成の準備中ですが早くも暗雲がたれて来ています。
特にこのデータの場合、構造体配列でもないので難度はさほどでもありません。
Vistaですので1GB増やすことには賛成ですが、今回の問題は別件なので解決しないと思います。なおメモリーは今後の事もありプラス、1GB増設しようかとも考えています。
実際のところサンプリングしているパソコンは別にしてサンプリング専用にした方が確実だと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: ソフトとパーフォマンスの関係
ソフト屋さん。漸く原因が分りましたが、、、しかし私にとって、対策は簡単ではありません。
私は今まで、データベースですから時間が命です。そのため年間一秒も狂ってはならない。
その為昔からパソコンの時計を使っていた。その時計が狂っても、インタネット接続しておれば自動修正が効くからと。
次のような(何処にでもある)リストを用いループで廻していた。
time(&mytime);
jtime = localtime(&mytime);
sprintf(buf0,"%2d時 %2d分 %2d秒",
jtime->tm_hour,
jtime->tm_min,
jtime->tm_sec
);
そして jtime->tm_sec の数値が変わるか無限ループで見て(検出)いた。
数値が変われば正確に一秒経過と云うことになる。
そして、ループを抜けるコードを記述する。
今までこれで何の不自由も感じられなかった。
実験のため時間関数を使わなくても無限ループを試しに造り、CPU使用率をモニターで調べた。
モニターは100%を示した。
私は、マサカ100%まで行かないと思っていた(先入観)。
しかし、他のソフトも平気な顔をして問題なく動いてはいる。
私の無知以外の何者でもありません。私の実力とはそんなモンです。
確かこのような時に割り込みを使うと聞いているが、やってみた事も私にはスキルもありません。
私は今まで、データベースですから時間が命です。そのため年間一秒も狂ってはならない。
その為昔からパソコンの時計を使っていた。その時計が狂っても、インタネット接続しておれば自動修正が効くからと。
次のような(何処にでもある)リストを用いループで廻していた。
time(&mytime);
jtime = localtime(&mytime);
sprintf(buf0,"%2d時 %2d分 %2d秒",
jtime->tm_hour,
jtime->tm_min,
jtime->tm_sec
);
そして jtime->tm_sec の数値が変わるか無限ループで見て(検出)いた。
数値が変われば正確に一秒経過と云うことになる。
そして、ループを抜けるコードを記述する。
今までこれで何の不自由も感じられなかった。
実験のため時間関数を使わなくても無限ループを試しに造り、CPU使用率をモニターで調べた。
モニターは100%を示した。
私は、マサカ100%まで行かないと思っていた(先入観)。
しかし、他のソフトも平気な顔をして問題なく動いてはいる。
私の無知以外の何者でもありません。私の実力とはそんなモンです。
確かこのような時に割り込みを使うと聞いているが、やってみた事も私にはスキルもありません。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: ソフトとパーフォマンスの関係
一秒単位の時刻で良いのなら、次の時刻が来るまで監視している部分でSleep(100);で100msほどCPUを他のプロセスに明け渡してみてはどうでしょうか?
そうすれば激烈にCPU使用率は下がると思います。
Sleepを使う場合は"Windows.h"をインクルードしてください。
問題となるような遅延も発生しないと思います。
ファイル書き込み中に停止する問題は、ファイルを非同期書き込みかスレッドで操作します。
どちらも色々とややこしいのですが、どうされますか?
そうすれば激烈にCPU使用率は下がると思います。
Sleepを使う場合は"Windows.h"をインクルードしてください。
問題となるような遅延も発生しないと思います。
ファイル書き込み中に停止する問題は、ファイルを非同期書き込みかスレッドで操作します。
どちらも色々とややこしいのですが、どうされますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。