C與Java中取精確到毫秒的時間

 我們在編程中經常會爲了測試性能,要取一個操作前後的時間差。在java中很簡單,用System.currentTimeMillis()函數,就能夠得到當前時間,精度爲毫秒。在c語言中,大多數的日期類函數都是精確到秒的,如time(),localtime()。精確到毫秒的函數有ftime(),gettimeofday(),都是返回一個結構。其中ftime()在time.h中定義,返回一個struct timeb的結構,包含了秒和毫秒。
    現在問題來了,我需要從c程序發起corba調用,調用到java程序,再返回給c程序,要求計算出c到java,java到c的調用時間。java的System.currentTimeMillis()函數返回一個很大的long正整數,查文檔是從1970年1月1日到當前的毫秒數(三十多年了,換算成毫秒,是一個很大的數了)。而在c中用ftime()得到的結構,秒乘以1000加上毫秒,居然是個負數,雖然也是在一秒一秒地遞增,換算起來這些時間大概有17天,這是什麼意思呢?關鍵是兩種語言的基準時間不同,我怎麼計算他們之間的時間差啊。犯難了。
    經再一次測試,哈,問題找到了。原來timeb結構中定義秒字段的是一個int類型,我先給它乘以1000,它就溢出了,變成了負值,其實本來的值還是正數的。再經過簡單的計算,它也是從1970年1月1日開始計時的,原來c和java中是以一個基準來計算時間的,太好了,這樣我就能夠用c和java中取出的時間值直接做減法了。
    從這裏也可以看出,c語言追求的是效率,爲了節省內存,只用一個int值存放秒數,害的溢出了。而gettimeofday()函數經測試,精度比較差,原因未知。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章