テーマ、知りたいこと
スコープとかメモリとかは勉強した最初の頃は耳にしますけど結局何がホントの正解?どのくらい最適化されるの?なんミリ秒の影響があるの?実際どこに影響するの?(CPU?RAM?それとも何か?)的なことってよくわかんないですけど、意識する人はするんですか?
Javaとか難しくてよくわかんないですけど、Javaとかは設計思想でそういうデータ構造まで本来は意識した思想のライブラリが設計されがちとか?ほんとか嘘かもよくわからん話を聞きますけど。正直実装側が意識するほどでは無いんでしょうけど、ライブラリを作ってる側が意識してるとかなると先入観もってしまうし、みたいな?
背景、状況
Javaのような高級言語でプログラミングする時にハードウェアの特性を意識しますか???どのくらいハードウェアの特性を知って、理解していますか?
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
回答11件
#1
総合スコア23734
投稿2026/04/27 22:41
編集2026/04/27 23:24通常はまず意識しません。言語処理におまかせ
ただ多量のデータを扱う場合はメモリ消費量とかデスクIO回数とかを気にします。
なお
「CPUキャッシュを意識するために」
というのは アセンブラ、C レベルの言語ならありえますが高級と言われる言語では意識しても手の打ちようが無いです
#2
総合スコア14706
投稿2026/04/28 04:17
Javaのような高級言語でプログラミングする時にハードウェアの特性を意識しますか???
する場合もあります。
大きなデータを扱う場合にどれくらいのメモリを使えるのかとか、処理時間が長くなりそうな場合に並列処理させたりバックグラウンドに回したりGPUでの処理を検討したり(アルゴリズムを検討したり)とか、自分で書くより上手くやってくれるようなライブラリを探してみたりなどですね。
モバイルとかエッジデバイスなどだと、プログラムのファイルサイズにも気をつけなくてはならない場合もあったりしますね。
#3
総合スコア5902
投稿2026/04/28 07:29
「早すぎる最適化は諸悪の根源」という格言は半世紀以上前から良く知られています。 また、関連する格言として「実測せよ」とも言われています。
現代のモダンなコンパイラによる最適化技術は極まっていて、結果的に生成されるコードがどのようなものか事前に人が想像するのは無理です。 最適化を抜きにしても複雑高度なコンピュータがどのように絡み合ってどうなるのかは専門家でも頭の中でシミュレートは出来ないものなのです。
わかるはずのないことを勝手な想像で「こっちのほうが効率的だろう」というように判断していくとプログラムの構造が無茶苦茶になってしまうというのは昔から繰り返される悪手の代表的なものなのです。 綺麗な設計にしておけば後になってチューニングすることはそれなりに出来ます。
どうしてももっと性能が必要なときには完成が近づいてからどの部分でどのように計算リソースを使っているのか実測して、それを元にチューニングをするのが良いというのが一般的な考え方です。
事前にわかるはずのないことを意識するのが無駄という話なのでわかる部分では効率的な選択をするのは良いです。 データ構造やアルゴリズムのレベルでの効率化は意識してもいいんじゃないでしょうか。 ハードウェアレベルのことは意識してもどうせわからないです。
#4
なるほど。ハードウェアレベルのことはどうせ分からないのですね
ありがとうございます
#5
総合スコア86645
投稿2026/04/28 15:22
CPUキャッシュを意識するために頻繁に参照する変数と処理を先に固めておくとか。
組み込み系だと、このレベルのことを意識しないといけないケースもあるでしょうけど、そういうケースではアセンブラかせいぜいCあるいはCと同レベルの言語を使うのでしょう。JavaとかPython等だとそういう考慮は困難(無理)です。
ハードウェアの特性を意識しますか
上記に限らないハードウェアの話であれば、処理時間を気にするケースだと、CPUの速度、コア数、物理メモリサイズ、ストレージの速度などいわゆるハードウェアスペックは意識することが多いと思います。
シビアなケースでなくても、例えば数百MBのデータが入った配列があるとして、「このメソッドを使うと一時的に元の配列と同じくらいのサイズのオブジェクトが新規作成されるが、別のこの方法を使うとそういう事は無い」などの考慮をする人は多いと思います。これはハードウェアというよりも、言語処理系のライブラリ内の処理方法の話ですね。メソッドのリファレンスにはおそらくそのレベルまで書いてあるはず。
ハードウェアじゃなくてOSレベルの話だと、JavaじゃなくてCの話ですが、ファイルの読み書きに open/close/read/writeを使うのかfopen/fclose/fread/fwriteを使うのかというのは、キャッシュの使いかたやシステムコール回数に影響するので、Cプログラマだと普通は意識しているでしょう。
似たレベルの別の話では、これは言語問わずですが、プログラム中で1つのファイルに何度も追記する際に、その都度「追加書きモード」でオープンして書いてクローズするのと、最初に1回オープンしてそのファイル変数をずっと使うのとでは、何万回も書く場合は、処理時間に対しての影響が大きいとか。
(シェルスクリプトの場合は明示的にopenとか書く必要がなく、「ループの中で >> outfileと書く」のと「ループ全体を > outfileとする」の違いなので、前者のように書いてしまっている人がたまにいます。ループ回数が少なければどうでもいいのですが)
#6
総合スコア23734
投稿2026/04/29 09:14
CPUキャッシュを意識するために頻繁に参照する変数と処理を先に固めておくとか。
N88なんとか という BASICもどきで測定器制御していた時代・・・古い! 先の千年紀!
でやったことがあります。
初期化の後 測定モードでひたすらloopしますが「loopを一定時間内に終わらせたい、でも終わらない なんとかならんか」、と相談を受けました。loop内で使う変数をプログラムの冒頭で定義(適当な値を代入)することで解決。
・変数名 → アドレス変換はtableサーチだろう
・tableへの登録は変数が出てきた時に実施だろう::出現順に並んでる
・検索はバカサーチに決まってる
という読みが当たりました
今は中間言語にしてから実行ですから、そんなことしても速くはならんでしょう
#7
総合スコア2118
投稿2026/04/30 08:32
こういうのって今時どんな感じなのかなと思って、C/C++ の分岐予測について調べた結果。
・前提として、かなり古い CPU からパイプラインによる先行実行が実装されていた。逐次処理は速いけど、分岐予測が外れると先行実行分が全部無駄になる。
・昔は condition が真になりやすいなら if ( condition ) foo() else bar() の順で書けと言われていた
・でも if は実行されないことが多い、for や while などのループは実行されることが多い、などの傾向があったり、その傾向から外れた実装をしたい場合など、開発者が分岐を指定したくなるケースもあった。
・例えば Pentium4 などでは
・DS (Branch Not Taken): 分岐しないと予想
・CS (Branch Taken): 分岐すると予想
といった感じで指示ができたが、CPU ごとに書き方はバラバラ。
・gcc で 2000年に __builtin_expect で分岐予測を指定できるようになった。
・Linux カーネルにおいて、likely・unlikely マクロで __builtin_expect を使いやすくした
・C++20 で likely・unlikely が規格化
・ただ CPU で動的予測が進化し、実行する中でこの if 文はほぼ偽だなとなればそれに応じた処理をするようになり、人間が指示する必要性は薄れた。
・CPU キャッシュの実装 (i486) で、速度が CPU キャッシュ >>>> メモリ となったため、使用頻度が高いコードだけ CPU キャッシュを使わせたいニーズも高まった。これは動的予測ではカバーできず、コンパイル時に決めるしかないため likely・unlikely の必要性はなくなってはいない。
・結果として、Linux カーネル・CPython・OpenJDK・MySQL・PostgreSQL・Chrome など、likely・unlikely は各所で使われている。
・PGO (Profile Guided Optimization) という、一度実行して分岐傾向などをプロファイリングした上で、それを元に再コンパイルするやり方もある。
JVM だと likely・unlikely などの指定はできませんが (おそらく思想として開発者にやらせない)、JVM はかなり賢くていろいろな最適化をやってくれますので、最適化されやすいコードを書くことに注力するのが世の中の流れのようです。
例: https://qiita.com/ShigemoriMasato/items/21a5e791cde3bfcbb8d2
#8
ありがとうございます!
https://qiita.com/ShigemoriMasato/items/21a5e791cde3bfcbb8d2
どちらも計算量はO(n²)で同じですが、実測すると後者は5~10倍高速です。これは、メモリアクセスパターンがCPUキャッシュの動作原理に合致しているからです。
自分でも今ご回答で自分の質問の文脈に気がついたのですが、こういう話だったんですね。
具体的で助かりました!
#9
総合スコア23734
投稿2026/04/30 22:54
#10
総合スコア4888
投稿2026/05/04 07:01
ケースバイケースでしょう
処理速度を優先するかor整備運用工数削減を優先するかで答えが変わります。プログラミングだけの都合ではなく、別の立場で定量化することが必要です。例えば「それぞれの効果で得られるお金を見積もり、お金としてどれだけ利益が出るか」といった考え方が一例です。
#11
総合スコア24
投稿2026/05/13 01:43
過去にゲーム開発をしてたときはメモリフラグメンテーションを意識することがありました。
プログラムが起動してから、終了するまで、ずっと持っておくべきデータ(進行度、レベル、所持金など)と
プログラムの途中で生成し、廃棄するデータ(ステージ1の敵キャラクターのテクスチャ、モデルは、ステージ1が始まるとき生成、クリアしたら廃棄。ステージ2、ステージ3も同様)があって、
メモリ取得位置がバラバラになっていると、まとまったメモリ領域が無くなるため、3日間ぶっ通しでゲームすると、ゲームが異常終了する不具合が起きたりします。
大規模、長時間の起動が必要なプログラムでは、意識する必要があるのかなと思います。
・・・事前に学んでおいて潰す、というよりは、チェックが始まってから気づき後出して対処するケースの方が多いですが。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
関連した質問
プログラミングにおいて細かいルールなどはあるのでしょうか?意識されますか?例えば同一フローで処理を前後させられる場合、CPUキャッシュを意識するために頻繁に参照する変数と処理を先に固めておくとか。