ここから本文です

プログラム 変数をブロック外と中に置くのは どっちが早いのですか?

mos********さん

2020/4/208:40:16

プログラム 変数をブロック外と中に置くのは どっちが早いのですか?

プログラムの先輩方よろしくお願いいたします。
今私は、どっちの記述が早いのか知りたく
この質問をしております。

パターンA ブロック内に変数を書く
int main(void) {
double testA = 計算式;
}

ーーー

パターンB ブロック外に変数を書く
double testA ;
int main(void) {
testA = 計算式;
}
ーーー
AとBはどっちが早いのでしょうか?
実際には多くの変数を使いますが、
double testA ,testB testC・・・testZ;
をブロック外内 どっちに置いたほうが早いのか教えてくださいませ。

閲覧数:
62
回答数:
5
お礼:
25枚

違反報告

回答

1〜5件/5件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

ama********さん

2020/4/400:24:53

https://www.ibm.com/developerworks/jp/java/library/j-praxis/pr35.ht...

>instanceAccess とstaticAccess が費やす実行時間は、ほぼ同じです。 しかし、stackAccess は 2 倍から 3 倍高速に実行されます。スタック変数へのアクセスは、さらに高速に行われます。それは、JVM が実行する作業量が、static 変数やクラス・インスタンス変数にアクセスするときの作業量よりも少ないからです。

それより、下記のほうが問題。

◆Stringが やたら遅いとか、Stringはメモリーを無駄遣いしがち(メモリーを大量に消費するとGC(Garbage Collection))が発生しやすくなる)。
対応策
StringBuilderは非常にパフォーマンスが良いですがスレッドセーフでは有りません、StringBufferはStringBuilderより微妙にパフォーマンスが悪いですがスレッドセーフです、良く分からない場合はStringBufferを使って下さい(StringBufferでもStringと比べれば圧倒的にパフォーマンスが良いです)。

◆古いスレッドがクズ。
対応策
「Concurrency Utilities」のスレッドを使う。

知らない間にThreadが非推奨に?(正式な非推奨では無いかもしれないが、そんなクズみたいなモノを何時までも使わないでくれよ、って話)

マルチコア時代のCPUリソースを有効活用--Java EE 7で進化した並列処理を理解する
https://builder.japan.zdnet.com/java/35032957/
https://builder.japan.zdnet.com/java/35032957/2/

◆GC(Garbage Collection)の処理でプログラムの実行が阻害される。
対応策
メモリーを無駄遣いしないように注意してプログラミングする。

  • ama********さん

    2020/4/401:18:22

    https://builder.japan.zdnet.com/sp_oracle/35077771/2/

    >Java SE 8におけるラムダ式の実装
    >
    > 最後に残った問題は、ランタイム側でラムダ式をどのように実行するかだが、これは前述のようにランタイムの実装に依存する部分である。バック氏によれば、Oracle Java SE 8の現状の実装では、内部クラスを使って実現しているという。
    >
    > 先に「内部クラスによる実装は問題が多い」と説明したが、Oracle Java SEの場合、構文スコープの値を取得しない場合にはSingletonを使ってヒープのアロケーションを避けるなど、さまざまな工夫によって通常の内部クラスを使う場合よりも高いパフォーマンスが得られるようになっている。つまり、ラムダ式と同等の処理を内部クラスとして自前で書くよりは、素直にラムダ式を使ったほうがパフォーマンスが良いということだ。

  • その他の返信を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

プロフィール画像

カテゴリマスター

uso8megaさん

2020/4/213:45:29

>実際には多くの変数を使います
小さい領域ならブロック内[スタック領域]
に置いた方がCPUの低次キャッシュに残り
易く速くなるかと。大きい領域なら、実
稼働ハードの状況+コード依存で変わって
来るので実測してみる しか ありません。
[基本的に速度にシビアな並列環境での話]

ここまで誰も言及していないのが不思議
です[多分 並列化・最適化に根を詰めた
経験が薄いのでしょう]が、CPUレジスタ
を占有出来なかった場合の変数はCPUの
キャッシュにどれだけ残れるかで速度が
変わります。メインメモリに追い出され
ると、数十倍~百倍くらいアクセスが遅
くなると考えてください。
https://gigazine.net/news/20180911-access-speed-history/
https://www.cspp.cc.u-tokyo.ac.jp/hanawa/class/spc2016a/sp20161018....
まぁコレを実感出来るコード リファクタ
リングを要求されるレベルは一般PGか
らは少し遠いでしょうけど、一カ月が
一~二週間に縮むような膨大な演算環境
に居ると自然とシビアになって来るかと。

bas********さん

2020/4/212:29:21

大差ないと思います。(速度的には)

ただし、関数の外に置くのは大変危険です。
企業レベルだと、複数人で作るようです。
そのときに、関数の外で宣言(グローバル変数) すると、
どこからでもアクセスができてしまうので、
「間違って書き換えられた」とかでデバッグが大変になることがあります。

例えば極端な例(実際にあるかどうかは別として)で、
大学入試とかそういうアレで使うプログラムを組むとします。

点数を p (point) とすると、

p が 70点以上なら合格、それ以下なら不合格 と仮定します。

そのとき、ある人の p が 80 なのに、p をグローバル変数として確保していた場合、チーム内の別のだれかが間違ってこのpを 40 に書き換えてしまったとします。
そうなるとどうでしょうか。

本来なら "合格" なのに、"不合格" になってしまいました。

このように、「間違って書き換わる可能性がある」ので基本的にグローバル変数は非推奨です。

一人で開発しているときでも同じです。
一か月後に自分が書いたコードを読んでみてください。
一瞬、忘れていると思います。
そういう風に自分ですら忘れていたりするのに、他人が完璧にわかるはずはありません。
なのでグローバル変数は非推奨です。

>> 実際には多くの変数を使いますが、
>> double testA ,testB testC・・・testZ;

これは、「複数人のテストの結果」のように、意味が大体同じものでしょうか。
それなら「配列」を使ったほうがいいです。

double points[10];

等のように。

プロフィール画像

カテゴリマスター

nan********さん

2020/4/211:38:18

とても細かいレベル、数ナノ秒程度の差はあるかも知れませんが、事実上差はありません。

それよりも、変数宣言は変数を使用する場所の出来るだけ近くで宣言し、ブロック内でしか使わないならブロック内で宣言するようにしましょう。
変数スコープとか、局所化などでググってみてください。

プロフィール画像

カテゴリマスター

あみやさん

2020/4/211:26:19

コンパイル後はどちらもメモリ上のただのエリア
どちらも変わらないはずです。
ただし、オブジェクトを生成破棄を繰り返すような時は、使い回す方が軽くなります。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる