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

回答編集履歴

4

修正

2018/02/02 04:00

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -25,7 +25,7 @@
25
25
 
26
26
  **AddOnce()実行結果**
27
27
  ![AddOnce](e56be96b12195edb9520de596c9f57f8.png)
28
- AddOnce内ではAddMethod()を呼んでいるだけなのでSelfが0.2。ほんとは0のはずですがAddTwice()の結から誤差かと思います。
28
+ AddOnce内ではAddMethod()を呼んでいるだけなのでSelfが0.2。ほんとは0のはずですがAddTwice()の結から誤差かと思います。
29
29
 
30
30
  **AddTwice()実行結果**
31
31
  ![イメージ説明](1254ce5aa6f2dce4db373c538a04ce40.png)

3

修正

2018/02/02 03:59

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -78,7 +78,7 @@
78
78
  ### 最後に
79
79
  なぜ、「なるはずです」なのか?
80
80
  検証していないからです。ですが、それなりの自信があるので回答させていただきました。
81
- ProfilerのCPU Hierarchyはフレーム内に処理が収まっているかを確認する為のものです。収まらなければ処理落ち、収まればスムーズに動きます。もしSelfとTotalの値が合算でない場合を想像してみてください。フレームに収まらない処理をProfilerで見つけるのがかなり困難になります。なのでドキュメントに載せない。合算で当たり前なのょう
81
+ ProfilerのCPU Hierarchyはフレーム内に処理が収まっているかを確認する為のものです。収まらなければ処理落ち、収まればスムーズに動きます。もしSelfとTotalの値が合算でない場合を想像してみてください。フレームに収まらない処理をProfilerで見つけるのがかなり困難になります。なのでドキュメントに載せない。合算で当たり前なのかもれません
82
82
 
83
- necosさんが疑問に思う姿勢はすごく正しいことだと思います。当たり前はとても怖いです。
83
+ ですが、necosさんが疑問に思う姿勢はすごく正しいことだと思います。当たり前はとても怖いです。
84
84
  なので今回検証することにしました。今回の検証でスッキリしていただけましたら幸いです。

2

追記

2018/02/01 14:02

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -2,4 +2,83 @@
2
2
  Self : 関数の処理負荷
3
3
  Total : 関数の処理負荷 + 外部の関数を呼んでいる場合、外部の関数を合わせた処理負荷
4
4
 
5
- なので「Calls==10だとしたら10回呼ばれた結果が関数だけの処理ならSelfの値、関数完了までにすべて呼ばれた処理はTotalの値」になるはずです。
5
+ なので「Calls==10だとしたら10回呼ばれた結果が関数だけの処理ならSelfの値、関数完了までにすべて呼ばれた処理はTotalの値」になるはずです。
6
+
7
+ ### (追記)検証してみました
8
+ Calls、Self、Totalの関係を検証してみました。
9
+
10
+ **▼検証環境**
11
+ Unity 2017.3.0p3
12
+
13
+ **▼検証内容**
14
+ テスト1回目 重い処理を1度実行 [関数名 AddOnce()]
15
+ テスト2回目 重い処理を2度続けて実行 [関数名 AddTwice()]
16
+ 上記2度のテストでCalls、Self、Totalの関係性を調査しました。
17
+ ※ 検証しやすいようにCoroutineを使っています。
18
+ ※ AddOnce()、AddTwice()共にAddMethod()という重い処理を呼ぶ構成です。
19
+
20
+ **▼検証結果**
21
+ 思っていたのと同じ結果です。
22
+ ・Calls==10だとしたらSelf、Total共に合算の負荷が表示される
23
+ ・関数だけの処理ならSelfに表示
24
+ ・関数+外部関数を含めた処理ならTotalに表示
25
+
26
+ **AddOnce()実行結果**
27
+ ![AddOnce](e56be96b12195edb9520de596c9f57f8.png)
28
+ AddOnce内ではAddMethod()を呼んでいるだけなのでSelfが0.2。ほんとは0のはずですがAddTwice()の結界から誤差かと思います。
29
+
30
+ **AddTwice()実行結果**
31
+ ![イメージ説明](1254ce5aa6f2dce4db373c538a04ce40.png)
32
+ AddTwice()内ではAddMethod()を2回呼んでいるので、AddMethod()のCallsが2に増えているのでCalls数は合ってます。そして、Selfが0、TotalがAddOnce()時のほぼ2倍なので合算で間違いないと思います。AddOnce()と誤差がありますが、EditorOverheadの値も違うので色々なものが影響していると思います。
33
+
34
+ **▼検証コード**
35
+ ```C#
36
+ using System.Collections;
37
+ using UnityEngine;
38
+
39
+ public class ProfilerTest : MonoBehaviour
40
+ {
41
+ IEnumerator Start()
42
+ {
43
+ yield return new WaitForSeconds(1);
44
+ AddOnce();
45
+ //AddTwice();
46
+ }
47
+
48
+ void AddOnce()
49
+ {
50
+ AddMethod();
51
+ }
52
+
53
+ void AddTwice()
54
+ {
55
+ AddMethod();
56
+ AddMethod();
57
+ }
58
+
59
+ void AddMethod()
60
+ {
61
+ var c = 0;
62
+ for (int i = 0; i < 500000; i++)
63
+ {
64
+ c += i;
65
+ }
66
+
67
+ ShowConsole(c);
68
+ }
69
+
70
+ void ShowConsole(int count)
71
+ {
72
+ Debug.Log(count.ToString());
73
+ }
74
+ }
75
+
76
+ ```
77
+
78
+ ### 最後に
79
+ なぜ、「なるはずです」なのか?
80
+ 検証していないからです。ですが、それなりの自信があるので回答させていただきました。
81
+ ProfilerのCPU Hierarchyはフレーム内に処理が収まっているかを確認する為のものです。収まらなければ処理落ち、収まればスムーズに動きます。もしSelfとTotalの値が合算でない場合を想像してみてください。フレームに収まらない処理をProfilerで見つけるのがかなり困難になります。なのでドキュメントに載せない。合算で当たり前なのでしょう。
82
+
83
+ necosさんが疑問に思う姿勢はすごく正しいことだと思います。当たり前はとても怖いです。
84
+ なので今回検証することにしました。今回の検証でスッキリしていただけましたら幸いです。

1

修正

2018/02/01 14:01

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -2,4 +2,4 @@
2
2
  Self : 関数の処理負荷
3
3
  Total : 関数の処理負荷 + 外部の関数を呼んでいる場合、外部の関数を合わせた処理負荷
4
4
 
5
- なので「Calls==10だとしたら10回呼ばれた結果がSelfの値」になるはずです。
5
+ なので「Calls==10だとしたら10回呼ばれた結果が関数だけの処理ならSelfの値、関数完了までにすべて呼ばれた処理はTotalの値」になるはずです。