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

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

ただいまの
回答率

90.61%

  • C#

    6852questions

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

  • Unity

    3808questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • CSV

    603questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 433

Leeeeeeeeon

score 1

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

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

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

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

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

using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
using System.IO;
using System;

public class StopWatch_test : MonoBehaviour {


    //Stopwatchのインスタンス作成
    System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();  
    private GameObject cube;
    private int i = 1;

    //書き出し準備
    StreamWriter sw;
    FileInfo fi;

        // Use this for initialization
    void Start () {
        cube = GameObject.Find ("Cube");
        //ファイル準備
        fi = new FileInfo(Application.dataPath + "/" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".csv");
        sw = fi.AppendText();

    }

    // Update is called once per frame
    void Update () {

    //回数制限
        if (i > 10000) {
            return;
        }

    //計測リセット
        stopwatch.Reset ();
    //計測開始
        stopwatch.Start (); 

    //計測したい処理
        cube.transform.Rotate (new Vector3 (0, 0, 30));

    //計測終了
        stopwatch.Stop ();

    //処理時間を秒で取得
    float elapsed = (float)stopwatch.Elapsed.TotalSeconds; 

  //書き出す
        sw.WriteLine(stopwatch.Elapsed);
        sw.Flush();
        sw.Close();
    //Debug
    Debug.Log(stopwatch.Elapsed);


    i++;

    }

}

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

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

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

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


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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/18 18:44 編集

    返信ありがとうございます.
    ソースコード括らずに読みづらく申し訳ないです.

    Start()内からUpdate()に移動させ,
    //ファイル準備
    fi = new FileInfo(Application.dataPath + "/" + DateTime.Now.ToString("yyyyMMddHH") + ".csv");
    sw = fi.AppendText();


    と変更しましたら無事に解決しました.ありがとうございます.

    キャンセル

+1

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

//回数制限
if (i > 10000) {
    sw.Close();
    return;
}


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/18 19:11

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

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    6852questions

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

  • Unity

    3808questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • CSV

    603questions

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