我们在编程中经常会为了测试性能,要取一个操作前后的时间差。在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()函数经测试,精度比较差,原因未知。
现在问题来了,我需要从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()函数经测试,精度比较差,原因未知。