• ベストアンサー

コードの簡素化とメリットについて

例えば以下のようにコードを簡素化すると、当然書くほうの管理が楽になりますが、処理速度が速くなったりあるいは、プログラムサイズが小さくなる等のメリットがあるのでしょうか? <冗長なコード> 関数1{  関数3の定義 } 関数2{  関数3の定義 } <簡素なコード> 関数1{  関数3の呼び出し } 関数2{  関数3の呼び出し } 関数3{ }

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

たしかに「冗長」よりも「簡素」の方が、 関数呼び出し処理にいくらかの時間がかかります。 しかし、(計ったことはないけれど)かかる時間は多くて10クロックぐらいでしょう。 1GHzのCPUだと、1億回呼び出して1秒程度の遅れです。 深いループの中では、これを考慮して「冗長」にする場合もありますが、 通常はこの程度の遅れは無視します。 プログラムサイズの点では、もちろん「簡素」の方が小さくなります。 しかしもっとも重要な違いは、変更の時に表れます。 関数1と関数2の処理が同じである必要がある場合、 処理を変更するとき、 片方を変更して片方を変更し忘れてしまうことがよく起こります。 「簡素」の方はそういうことは起こりません。 まとめると、 ・実行時間では「冗長」が有利。ただしほんの少し。 ・プログラムサイズでは「簡素」が有利。 ・変更とプログラム管理の点では「簡素」の方が圧倒的に有利。 よって、通常は「簡素」にします。

VitaminBB
質問者

お礼

回答ありがとうございます。 良く分かりました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • mcWalker
  • ベストアンサー率69% (27/39)
回答No.4

今ははやりませんが、以前は速度を出すため、簡素なコー ドの方の、関数3の定義に inline を付けて、冗長なコー ドと同じ object を生成させる場合がありました。 今は、冗長なコードのように書くと、初心者と思われる でしょう。(ソース・コードの行を増やしてやたら仕事 をたくさんしたように見えるため)

VitaminBB
質問者

お礼

回答ありがとうございます。 これ面白いですね。

全文を見る
すると、全ての回答が全文表示されます。
  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.3

> 当然書くほうの管理が楽になりますが、 通常、このメリットがほかの全てのメリットに優先します。 処理速度や占有メモリサイズに関してはコンパイラの最適化能力によって大きく変わります。 一般論として「速く書けば大きくなる」、「小さく書けば遅くなる」は成立します。 ただし、「遅いコード」「大きくなるコード」と「冗長なコード」はイコールではありません。 大雑把に言って、WindowsXPが快適に動作するような環境であれば「ほとんどの場合、簡潔に書くことが正解」と言えるでしょう。 世の中には「数メガクロックの8ビットCPU」と言うものが存在し、「プログラムコード領域は数キロバイトのROMしかない」という状況も存在します。 この場合、「簡潔で速く」とか「簡潔に小さく」が求められますが「冗長に」を求められることはありません。

VitaminBB
質問者

お礼

回答ありがとうございます。 良く分かりました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

「冗長」なコードは、スピードは速くなると思いますが、サイズは大きくなります。 スピードが速くなると言っても、関数の Call と関数からの Return の分だけですから、普通は数10 クロック程度です。(特権レベルの異なる Call/Return だと 110 クロック) 最近の 1GHz とかの CPU だと、 1 クロック = 1秒/(10^9) ですから、よっぽどの回数のループでもなければ、差が表れないと思います。 保守・管理のしやすさ/実行速度のどちらをどれだけ優先するかというのは、要求されている仕様によって変わってくると思いますが、最近は CPU の性能が上がっているので、この程度の差なら「簡素なコード」の方を採用することが多いんじゃないかと思います。

VitaminBB
質問者

お礼

回答ありがとうございます。 良く分かりました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ソースコードを美しく綺麗に書くことはどんなメリットをもたらしますか?

    プログラムコードを書くときに美しく綺麗に書くことはどんなメリットをもたらしますか?

  • クロージャを利用するメリットについて

    コボラーです。 いや、PHP、Perl、VB、C#、JavaScript、VC++、ActionScript、Java、Objective-Cは書けるけどCOBOLは書けないのでコボラーではありませんね。 モダンなプログラムコードが好きではない、レガシーなプログラマーとしておきましょう。 自己紹介はこれくらいにして・・・ 今までもアチコチで話されていると思いますが、クロージャ(無名関数)を利用するメリットについてです。 ・グローバル変数の数を減らせる ・関数内の変数値を保持しておける この2つのメリットについては理解しました(これがメリットかどうかは別として) その他には ・1回しか利用しない関数に名前を付けなくて済む ・1回しか利用しない関数が、利用する箇所に書かれているので、コードを追っている間に迷子になり辛い こんな意見も見受けられました。 もしかしたらこれは、オブジェクト指向 vs 関数型プログラミングという話しになってしまうかもしれませんが、そもそも1回しか利用しない処理を関数化するメリットってなんでしたっけ? オブジェクト指向で考えれば、1メソッド当たりのコード数は少ない方が良いとされていますので、そもそも無名関数ではなくオブジェクティブな作りにすると思います。 関数型プログラムでは、main処理の中で複数処理するような共通処理部分を関数化し、整理をしていきますよね。 そうなると、どちらにしても「1回しか使わない処理を、そもそも関数化する必要性」が見いだせないのです。 それなのにその部分を無名関数にする必要性は感じられませんでした。 もちろんコールバックに便利とか、イベントリスナーに使うのが便利なのは理解していますし、利用しています。 もし・・・ 利用する理由が「モダンぽくてカッコいいから」というなら、それならそれで構いませんし、それについて自分の意見をぶつけるつもりもありません。 (自分のコードがレガシーでかっこ悪くて無駄だと言われたら、全力で応戦しますが・・・) ぜひ明日から私もついつい使いたくなってしまうようなクロージャの有用な利用法を私に教えて下さい。

  • VBAを使うメリット

    はじめまして。現在、仕事でよくエクセルの関数を使っています。最近VBAに触れる機会がありました。 現在、ほとんどのことをエクセル関数を使ってしているので、今いちVBAのメリットがわかりません。でも、VBAの方が関数より難しいので、VBAを覚えた人はやっぱり、ほとんどVBAで処理した方がよいと感じるのでしょうか? みなさんはどのような時に関数で、どのような時にVBAを使われていますか?

  • C言語 再帰処理のメリットとデメリット

    最近、C言語の関数にも再帰定義ができるということを初めて知りました。 そこで聞きたいのですが、再帰処理のメリット・デメリットは何でしょうか? 思いついたものとしては メリット … 簡単に表記できる デメリット … 無限ループが発生する可能性あり でしょうか。 また、全計算が終わるまでに、途中の演算結果を保持しなければならないので、 メモリを無駄遣いしそうな気もします。

  • Worksheet.functionに関して

    VBAでTanhやRoundといったExcelの関数を使いたい場合、 Worksheet.functionという記述を使うことで使用することが可能ですが、 これを使うデメリットはないのでしょうか?自分で関数を定義して使った方が良いということはないのでしょうか? 他の人が書いたVBAのプログラムを見たことがないので分かりませんが、 Worksheet.functionばかり使っていると処理速度が遅くなったりしそうな気がするのですが、そのようなことはないのでしょうか?

  • VBAで一つのファンクションの中に全部コードを書いてしまいます

    VBAで一つのファンクションの中に全部コードを書いてしまいます Access VBAでプログラムを書いています。私がプログラムを書くと1つのファンクションの中に全てのコードを書いてしまいます。 例えば実行ボタンを押すと、Aテーブルからデータを抽出して、それを加工し、Excelへ出力するといった処理があるとします。他の人のプログラムを見ると、各処理毎にprocedureもしくはfunctionで機能を分けて作っています。私の場合は、1つの関数の中に全て書いてしまいます。 各機能ごとにプログラムを作りたいのですが、何かコツみたいなものはありますでしょうか?教えていただければ嬉しいです。

  • コード変換について

    はじめまして VB初心者です。 以下のような処理を行いたいのですがご教授願います。 項目A(漢字10文字)があります。 項目Aの中には外字で作成した漢字が埋もれています。 項目Aを参照し、そこにある外字コードを判断し 別の外字コードに変換したい。 ロジック的には1文字(2バイト)を読み込み 外字をバイナリ判定して別のコードに置き換えする 処理をしたい。 当方vb6.0ですが 定義の方法、ロジックなど教えていただければ幸いです。

  • Pro*Cで動的SQLを実現する為のライブラリ関数はどのファイルに入っているのでしょうか?

    こんにちわ。 UNIXのC++でPro*Cを使って動的SQLを使ったプログラムを作っています。 プログラムコードは出来上がっていて、単独コンパイルは通るのですが、 実行形式のプログラムを作る時のリンクで「未定義のシンボル」として 以下の4ライブラリ関数がエラーになります。 sqlald()関数、sqlprc()関数、sqlnul()関数、sqlclu()関数 これはおそらく、リンクする際にこれらの関数が含まれているライブラリを リンクできていないだけなのではないかと思っているのですが、 肝心のライブラリがどこのどれなのかがわかりません。 どなたかご存知の方がいらっしゃいましたら、教えてください。 もしかして、プログラム中でもこれらの関数をextern する以外に 何か必要なのでしょうか?

  • お店側にどういうメリットがあるのでしょうか?

    コメダ珈琲は最初からガムシロ入りで提供しますが お店側にどういうメリットがあるのでしょうか? ガムシロ入れの管理がないから楽なのでしょうか?

  • RaiseEventのメリット

    はじめまして。 VBでイベントを発生させる時にRaiseEventを使用しますが このメリットがいまいちよくわかりません。 類似した処理が複数ある場合に一箇所に集中できるメリットが あると聞きましたがそれなら自分でコントロールや標準モジュール、 クラスモジュールに自分で適した関数を作れば良いと 思うのですがRaiseEventを使用しないといけない処理とは どういうものなのでしょうか?