🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

1209閲覧

ターミナルでコンパイル、実行したものと.shファイルでコンパイル、実行したものの速度が違う

ktak

総合スコア13

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

4クリップ

投稿2019/11/14 09:36

編集2019/11/15 05:16

前提・実現したいこと

c++で書いたファイルをターミナル上でコンパイルして実行した時と、.shファイルを作成し、コンパイル、実行を自動で行った時に終了時間が目に見える形で遅くなってしまっています。
どういったところに原因があるのか見当がつかず、困っています。

//test.cpp #include <iostream> #include <vector> #include <time.h> // for clock() int main() { std::cout << "clock():\n"; for (int i = 0; i < 10; ++i) { std::vector<int> v; // int 型動的配列 clock_t start = clock(); // スタート時間 const int N = 1000*100; // 10万回 for (int i = 0; i < N; ++i) { v.push_back(i); // 末尾に i を追加 } clock_t end = clock(); // 終了時間 std::cout << "duration = " << (double)(end - start) / CLOCKS_PER_SEC << "sec.\n"; } return 0; }

こちらのコードをターミナル上で実行すると、

$ g++ test.cpp $ ./a.out
//実行結果 clock(): duration = 0.000552sec. duration = 0.000132sec. duration = 0.00013sec. duration = 0.00013sec. duration = 0.00013sec. duration = 0.00013sec. duration = 0.00013sec. duration = 0.000129sec. duration = 0.00013sec. duration = 0.000129sec.

となります。

//test.sh g++ test.cpp ./a.out

こちらのshファイルを実行すると、

//実行結果 clock(): duration = 0.003828sec. duration = 0.004294sec. duration = 0.004214sec. duration = 0.004259sec. duration = 0.003939sec. duration = 0.004081sec. duration = 0.003952sec. duration = 0.003898sec. duration = 0.003784sec. duration = 0.003933sec.

となります。

時間のかかり方が明らかに違うので、原因はどこにあるのかと困っています。

追記

環境に関して何も示しておらずすみませんでした。
Mac環境で動作させていています。
macOS Catalina 10.15.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/11/14 09:54

同じコードを試しにやってみましたが、どちらもdurationは15ms程度で有意な差はありませんでした。情報まで。
ktak

2019/11/14 09:58

なるほど、、ありがとうございます
dodox86

2019/11/14 12:03

どんな環境で実行されているのでしょうか。Linuxだとは思いますが、質問文中に編集、追記するかたちでご提示ください。
pepperleaf

2019/11/14 12:47

.shで作られた a.out を ターミナル(?)で実行した場合、どうなるのでしょうか? また、その逆は? (./a.out のみの ファイル)
dodox86

2019/11/15 04:57

macOSということですが、正確に示してください。Catalinaですか。それとも前のMojaveなどですか。
退会済みユーザー

退会済みユーザー

2019/11/15 05:05

macとか使ったことないので知りませんが、timeコマンドとかが使えたら、user/systemがそのプロセスで消費した時間が見れます。system消費時間でも変化があるようなら、これもmacで使えるかどうか知りませんが、straceなどの手段でシグナル経由のシステムコール?などに違いがないか調べるかもしれません。user消費時間に違いがあったらお手上げです。 どちらも違わなければ、他のプロセスの影響なので、環境依存的なものを調べるかなぁ…。
guest

回答3

0

ベストアンサー

ターミナル上のシェルから実行するのとシェルスクリプト内から実行するのでは、シェルスクリプト自体がプロセスになってその子プロセスとしてa.outが実行される(ターミナル上のシェルからみて孫プロセスになる)点が異なり、そのことでプロセスのCPU割り当て時間が有意に変わったりするのではないか、などと思いましたが、Ubuntu16.04 64ビット(VirtualBox)上で試したところでは変わりませんでした。

テスト結果の例です。

bash

1# シェルのプロセスIDを表示 2user01@ubuntu1604-x64:~$ echo $$ 32734 4 5# シェルスクリプトの内容を表示 6user01@ubuntu1604-x64:~$ cat t2sh.sh 7echo $$ 8g++ t2.cpp -o t2;./t2 9 10# シェルスクリプト内の同様のコマンドラインで実行 11user01@ubuntu1604-x64:~$ g++ t2.cpp -o t2;./t2 12clock(): 13duration = 0.002116sec. 14duration = 0.001884sec. 15duration = 0.002169sec. 16duration = 0.002199sec. 17duration = 0.002063sec. 18duration = 0.00194sec. 19duration = 0.001941sec. 20duration = 0.002111sec. 21duration = 0.00193sec. 22duration = 0.002033sec. 23 24# シェルスクリプトで、子プロセスとして実行 25user01@ubuntu1604-x64:~$ ./t2sh.sh 2622443 27clock(): 28duration = 0.002174sec. 29duration = 0.00192sec. 30duration = 0.001945sec. 31duration = 0.002022sec. 32duration = 0.001909sec. 33duration = 0.002016sec. 34duration = 0.002064sec. 35duration = 0.002146sec. 36duration = 0.002177sec. 37duration = 0.002103sec. 38user01@ubuntu1604-x64:~$ 39 40# シェルスクリプトで、かつ自シェルで実行 41user01@ubuntu1604-x64:~$ . ./t2sh.sh 422734 43clock(): 44duration = 0.002229sec. 45duration = 0.002118sec. 46duration = 0.001977sec. 47duration = 0.002075sec. 48duration = 0.002064sec. 49duration = 0.002102sec. 50duration = 0.002095sec. 51duration = 0.002091sec. 52duration = 0.002062sec. 53duration = 0.002039sec. 54user01@ubuntu1604-x64:~$

回答にはなっていませんが、ご参考まで。

投稿2019/11/14 12:40

dodox86

総合スコア9256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

dodox86さんのやり方を参考にしたところ、同じ速度で実行することができました。

$ . ./test.sh
で実行したところ、

clock(): duration = 0.000556sec. duration = 0.000156sec. duration = 0.000163sec. duration = 0.000159sec. duration = 0.000159sec. duration = 0.00016sec. duration = 0.000156sec. duration = 0.000157sec. duration = 0.000157sec. duration = 0.000156sec.

となり、早くなりました。

プロセスの仕組みなど、勉強します。

投稿2019/11/15 05:12

ktak

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ktak

2019/11/15 05:14

こちら、自己解決の場合の味覚のですね。すみませんでした。
dodox86

2019/11/15 05:20

$ . ./test.sh これで同じ時間となり、依然として有意な差が認められるのであれば、やはり子プロセス、孫プロセスへのCPU時間割り当ての違いだと思います。Linuxとは根本的にカーネルが違いますので。
dodox86

2019/11/15 05:25

> こちら、自己解決の場合の味覚のですね。すみませんでした。 いえ、この場合はご自分で別条件での追試を示した回答ですので、それほど不適切でも無いと(少なくとも私は)思いますよ。
ktak

2019/11/15 05:41

みたいですね。システム的な部分は全くわかってなかったので徐々に勉強していきます。
yumetodo

2019/11/15 05:54

fork以外にもこんなところで効いてくるものがあるとは思ってませんでした。勉強になりました。
dodox86

2019/11/15 05:56

私にとっても考えもしなかった初めてのケースで、興味深かったです。>yumetodoさん
guest

0

使ってるshellと.shを実行したshellが違う場合、環境変数が違うなどしてありえないとは言えませんが、普通に考えて気の所為でしょう。

投稿2019/11/14 12:11

yumetodo

総合スコア5852

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問