質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

3940閲覧

UnityでC#を用いて処理速度をCSVに出力したいです

Leeeeeeeeon

総合スコア7

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2017/09/18 09:08

編集2017/09/18 09:36

UnityでC#を用いて処理時間を計測しCSVに出力するコードを作成しています.

処理内容は特に今はこだわっていなため
cubeを回転させ,10000万回実行したら停止するようになっています.

またCSVは"yyyyMMddHHmmss"でAssetsに保存されるようにしてあります.

現在処理時間の計測とCSVへの出力がともに一応はできているのですが,
CSVへの出力が1回目の処理の値しか書き出されません.
![イメージ説明]

実現したいこととしてはコンソールに示されている(debugしている),
処理時間全てをCSVに書き出すことです.
イメージ説明
こちらの値をCSVに保存したいです.

C#

1using System.Collections; 2using System.Collections.Generic; 3using System.Text; 4using UnityEngine; 5using UnityEngine.UI; 6using System.IO; 7using System; 8 9public class StopWatch_test : MonoBehaviour { 10 11 12 //Stopwatchのインスタンス作成 13 System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch(); 14 private GameObject cube; 15 private int i = 1; 16 17 //書き出し準備 18 StreamWriter sw; 19 FileInfo fi; 20 21 // Use this for initialization 22 void Start () { 23 cube = GameObject.Find ("Cube"); 24 //ファイル準備 25 fi = new FileInfo(Application.dataPath + "/" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".csv"); 26 sw = fi.AppendText(); 27 28 } 29 30 // Update is called once per frame 31 void Update () { 32 33 //回数制限 34 if (i > 10000) { 35 return; 36 } 37 38 //計測リセット 39 stopwatch.Reset (); 40 //計測開始 41 stopwatch.Start (); 42 43 //計測したい処理 44 cube.transform.Rotate (new Vector3 (0, 0, 30)); 45 46 //計測終了 47 stopwatch.Stop (); 48 49 //処理時間を秒で取得 50 float elapsed = (float)stopwatch.Elapsed.TotalSeconds; 51 52 //書き出す 53 sw.WriteLine(stopwatch.Elapsed); 54 sw.Flush(); 55 sw.Close(); 56 //Debug 57 Debug.Log(stopwatch.Elapsed); 58 59 60 i++; 61 62 } 63 64}

Stopwatch以外の処理速度測定や,
コルーチンを用いて遅延を入れてから書き出すなども試しましたが
実現には至りませんでした.

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

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

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

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

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

guest

回答2

0

Update内でファイルをCloseしているため、1回書き込んだ後に書き込めなくなっています。
Flushの後にCloseするのではなく

C#

1//回数制限 2if (i > 10000) { 3 sw.Close(); 4 return; 5}

という感じで実行回数終了時にCloseするようにすればよいかと思います。
ただ、上記ですと回数終了後Updateが呼ばれるたびにCloseが行われるので
1回だけCloseするようにしたほうがいいと思います。

投稿2017/09/18 09:50

YAmaGNZ

総合スコア10242

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

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

Leeeeeeeeon

2017/09/18 10:11

返信ありがとうございます. Closeの位置が重要だったのですね. 解決はしましたが,より良いコードにまた作り変えるために 参考させていただきます.
guest

0

ベストアンサー

まず、ソースコードは「```」×2で括ってください。

1回目の処理だけが書き込まれるというわけではなく、ファイル名が変更されていないため、常に同じファイルを上書きしてしまっているようです。

C#

1//ファイル準備 2fi = new FileInfo(Application.dataPath + "/" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".csv"); 3sw = fi.AppendText();

上記処理をStart()内ではなく、Update()内にしてみたらどうでしょうか。


追記:
ごめんなさい、上記間違いでした。これから、修正します。
…ってやっているうちに、解決されたみたいですが、一応念のため。

C#

1 //書き出す 2 sw.WriteLine(stopwatch.Elapsed); 3 sw.Flush(); 4 sw.Close(); //←これ

上記ですが、一度sw.Close();としてしまうと、それ以降にswを使うことが出来なくなってしまいます。
そのため、sw.Close();をUpdate()内ではなく、OnDestroy()内で呼ぶようにすればよいです。
解決されたみたいに、再度ファイルを開きなおす方法でもよいです。

投稿2017/09/18 09:35

編集2017/09/18 09:52
fiveHundred

総合スコア9796

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

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

Leeeeeeeeon

2017/09/18 09:44 編集

返信ありがとうございます. ソースコード括らずに読みづらく申し訳ないです. Start()内からUpdate()に移動させ, //ファイル準備 fi = new FileInfo(Application.dataPath + "/" + DateTime.Now.ToString("yyyyMMddHH") + ".csv"); sw = fi.AppendText(); と変更しましたら無事に解決しました.ありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問