2017-11-30 10 views
2

シリアル通信を行っているアプリケーションで受信したメッセージのタイムスタンプタイムスタンプを追跡するための良い方法

アプリケーションがシリアルポートで毎秒20回ストリーミングメッセージを受信したとします。受信したメッセージのタイムスタンプを追跡したいとします。それを行う方法は、このようなことができます:

public class SerialPortHandler { 
    private DateTime _rxTimestamp; 
    private SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { 
     _rxTimestamp = DateTime.Now; 
     // Collect bytes in RX buffer and do stuff... 
    } 
} 

しかし、その後_rxTimestampは、毎回データが受信されたDateTimeオブジェクトの新しいインスタンスに設定されます。私は、C#には参照されていないオブジェクトをメモリに廃棄するガベージコレクションがあることを知っています。しかし、良いOOPの練習に沿って完全にそれをやり遂げるこの方法は、またはそれはコンピュータのリソースに関して無駄と見なすことができますか?

+0

タイムスタンプを何に使用しますか? – abto

+0

@abtoそれは重要ですか?しかし、議論のために、私は非同期通信を行い、メッセージが所定の制限時間内に受信されたかどうかを確認する必要があるとしましょう。 – Oystein

+1

ガベージコレクションインスタンスはありません(値タイプ)が、ここでの主なポイントは精度(これはプレーンなDateTimeを持たない)とUTC(これはDSTに/からDSTに切り替えるときには使用していませんホップ/穴があります)。システム時間のために、1秒間に20回がエッジにあります。あなたは参照として使用することができます(UTCタイム!)とストップウォッチ –

答えて

3

特定のケースでは、メモリ使用量に関して問題はありません。 System.DateTimea value typeであり、割り当てにボクシング値は含まれていないため、GCが収集する必要があるオブジェクトは作成されていません。唯一起こるのは、フィールド_rxTimestampの値が設定されていることです。

DateTimeのインスタンスを作成するとが正しい用語であると主張することもできます。現在の日時の64ビット値が_rxTimestampのメモリ位置に格納されます。古い値は単純に上書きされます。

+0

「非同期通信を行い、メッセージが所定の制限時間内に受信されたかどうかを確認する必要があります。私は、この答えは疑問とは関係ないと思います。 Questionarは_rxTimestampの値が上書きされていることを認識しており、目的を実行するための良い解決策を検討して検討しています。 – lucky

+1

@Rainman:あなたはこの問題を誤解しています。 OPは_reference_が上書きされることを認識していますが、メモリ**に残っている**オブジェクトについてはっきりと(そして**明示的に**)心配しています。OPから使用している見積もりは、特定の質問ではなく、コードの全体的な目的を説明することです。 – Flater

+0

@Sefeいい答えです。しかし、新しいオブジェクトインスタンスを定期的にフィールドに上書きし、参照されていないオブジェクトをメモリに残すことについての考慮事項についても言及できますか? – Oystein

関連する問題