teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

蛇足追記

2018/10/24 03:48

投稿

taka-saan
taka-saan

スコア665

answer CHANGED
@@ -53,4 +53,22 @@
53
53
  usleep( 300*1000 ); // 0.3秒かかるとする
54
54
  }
55
55
 
56
- ```
56
+ ```
57
+
58
+ ---
59
+ お節介かもですが勉強中ということですので、敢えてアドバイスさせてください。
60
+
61
+ 質問欄に提示されていらっしゃるソースコードですと、
62
+ 「1秒ごとの処理」を行う時間がくるまで全力でループを回り続けています。
63
+ こうするとCPUは無駄に回り続け、他のプロセスに割り当てるられるはずだった
64
+ CPUリソースを浪費してしまいます。
65
+ 具体的に言うと、仮にCPUが1個のコンピュータであればCPUのロードが100%になってしまいます。
66
+ 実害的には、電力を浪費する、他の処理が重くなる、などです。
67
+
68
+ このようなコードは、効率が悪い、お行儀が悪い、というレベルよりもう少し罪が重い、
69
+ "書いてはならないコード"に該当してしまいます。
70
+ ですので、プログラマを目指されているのでしたら、理解されておくべきかなと思います。
71
+
72
+ 対処としては、みなさんがおっしゃっている回答のように、
73
+ 空ループで時間を潰さずに、時間がくるまでsleepやタイマを使って待ちます。
74
+ 待っている間はCPUが浪費されません。

2

コード

2018/10/24 03:48

投稿

taka-saan
taka-saan

スコア665

answer CHANGED
@@ -5,4 +5,52 @@
5
5
  1秒から処理にかかった時間を差し引いたmicro秒の分だけを、
6
6
  [usleep()](http://php.net/manual/ja/function.usleep.php)でsleepしてあげればよいです。
7
7
 
8
- 処理に0.1秒かかったとして、0.9秒usleepとか。
8
+ 処理に0.1秒かかったとして、0.9秒usleepとか。
9
+
10
+ ---
11
+ 処理毎に毎回計測すると暴れないかわりに小さなズレは蓄積するので、
12
+ 最初に取った時刻からn秒後を基準として余りをusleepする例を書いてみました。
13
+
14
+ ```php
15
+ <?php
16
+ date_default_timezone_set('Asia/Tokyo');
17
+
18
+ $start = microtime(true);
19
+ for($i=1; $i<=100; $i++){
20
+
21
+ func1();
22
+ if( ($i % 10) == 1){
23
+ func10();
24
+ }
25
+
26
+ $end = microtime(true);
27
+ $n = (($start + $i) - $end)*1000*1000;
28
+ if( $n > 0 ){
29
+ usleep( $n );
30
+ }
31
+ }
32
+
33
+
34
+ //+++++++++++++++++++++++++++++++++++++++++++
35
+ function outputTime(){
36
+ $unixTime = explode( '.', microtime(true) );
37
+ $dispTime = date( 'Y/m/d H:i:s', $unixTime[0] ) . "." . substr( $unixTime[1].'0000', 0 , 3 );
38
+ return $dispTime;
39
+ }
40
+
41
+ function func1()
42
+ {
43
+ echo outputTime().PHP_EOL;
44
+ echo "1秒ごとに実行".PHP_EOL;
45
+
46
+ usleep( 200*1000 ); // 0.2秒かかるとする
47
+ }
48
+ function func10()
49
+ {
50
+ echo outputTime().PHP_EOL;
51
+ echo "10秒ごとに実行".PHP_EOL;
52
+
53
+ usleep( 300*1000 ); // 0.3秒かかるとする
54
+ }
55
+
56
+ ```

1

リンク追記

2018/10/23 10:49

投稿

taka-saan
taka-saan

スコア665

answer CHANGED
@@ -3,6 +3,6 @@
3
3
  「1秒ごとの処理」を始める直前のmicro秒を覚えておき、
4
4
  処理が終わった時にもう一度micro秒を取って、
5
5
  1秒から処理にかかった時間を差し引いたmicro秒の分だけを、
6
- usleep()でsleepしてあげればよいです。
6
+ [usleep()](http://php.net/manual/ja/function.usleep.php)でsleepしてあげればよいです。
7
7
 
8
8
  処理に0.1秒かかったとして、0.9秒usleepとか。