Objective c 绝对零秒vs绝对零秒
苹果有非常全面的文档,但我找不到任何关于函数AbsoluteToNonSeconds的文档?我要找出绝对时间和绝对时间的区别 注意 我开始认为苹果的文档只包含Objective-C函数?是这样吗 我通过使用Apple双击找到以下内容: 驱动程序的持续时间32位毫秒计时器Objective c 绝对零秒vs绝对零秒,objective-c,cocoa,Objective C,Cocoa,苹果有非常全面的文档,但我找不到任何关于函数AbsoluteToNonSeconds的文档?我要找出绝对时间和绝对时间的区别 注意 我开始认为苹果的文档只包含Objective-C函数?是这样吗 我通过使用Apple双击找到以下内容: 驱动程序的持续时间32位毫秒计时器 AbsoluteTime 64位时钟我不确定为什么没有在任何地方记录它,但如果有帮助的话,这是如何使用它的一个示例: static float HowLong( AbsoluteTime endTime, Abs
AbsoluteTime 64位时钟我不确定为什么没有在任何地方记录它,但如果有帮助的话,这是如何使用它的一个示例:
static float HowLong(
AbsoluteTime endTime,
AbsoluteTime bgnTime
)
{
AbsoluteTime absTime;
Nanoseconds nanosec;
absTime = SubAbsoluteFromAbsolute(endTime, bgnTime);
nanosec = AbsoluteToNanoseconds(absTime);
return (float) UnsignedWideToUInt64( nanosec ) / 1000.0;
}
更新:
“我对文档感兴趣的主要原因是想了解它与绝对化的区别”
那比较容易AbsoluteToNanoseconds()
返回一个类型为Nanoseconds
的值,该值实际上是一个UnsignedWide
结构
struct UnsignedWide {
UInt32 hi;
UInt32 lo;
};
相反,AbsoluteToDuration()
返回类型为Duration
的值,该值实际上是SInt32
或带符号的long
:
typedef SInt32 Duration;
持续时间
使用较小的有符号类型,因为它们用于保存相对时间<另一方面,代码>纳秒只作为正值才有意义,而且它们可能非常大,因为计算机一次可以运行数年。根据
SubAbsoluteFromAbsolute()
,以及其他所有的*Absolute*函数,都已从Mavericks中删除。我已经证实了这一点
这些函数不再是必需的,因为至少在Mavericks和Mountain Lion(我测试过的两个)中,mach\u absolute\u time()
已经以纳秒为单位返回时间,而不是以绝对形式返回时间(过去是总线循环数),因此不再需要进行转换。因此,不再需要中显示的转换以及web上多个位置显示的类似代码。通过检查mach\u timebase\u info()
返回的分子和分母是否为1,可以在您的系统上确认这一点
以下是我的测试代码,其中包含大量输出,以检查您是否需要在系统上执行转换(我必须执行检查,因为我的代码可能会在较旧的Mac上运行,尽管我在程序启动时执行检查,并设置函数指针以调用不同的例程):
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
那么现在就开始吧;
uint64_t abs,纳米级;
马赫时基信息数据时基信息={0,0};
然后=马赫绝对时间();
睡眠(1);
现在=马赫绝对时间();
abs=现在-那时;
马赫时基信息(和时基信息);
谢谢。事实上,我对这些文档感兴趣的主要原因是想找出它与绝对相减的区别。有什么理由我必须使用次绝对相减而不是普通相减法吗?当然
如果时间过了,返回0而不是负数。我已经通过更新我的答案对您的第一条评论做出了回应。我希望这是有意义的。“我开始认为苹果文档只包含Objective-C功能?是这样吗?”没有。许多基于C的API都有文档记录。你应该提交一份bug报告,要求绝对无秒和朋友被记录:mach\u timebase\u info()
在iOS上不返回{1,1}
,所以我们仍然需要一些转换函数。
#include <CoreServices/CoreServices.h>
#include <mach/mach.h>
#include <mach/mach_time.h>
#include <time.h>
#include <iostream>
using namespace std;
int main()
{
uint64_t now, then;
uint64_t abs, nano;
mach_timebase_info_data_t timebase_info = {0,0};
then = mach_absolute_time();
sleep(1);
now = mach_absolute_time();
abs = now - then;
mach_timebase_info(&timebase_info);
cout << "numerator " << timebase_info.numer << " denominator "
<< timebase_info.denom << endl;
if ((timebase_info.numer != 1) || (timebase_info.denom != 1))
{
nano = (abs * timebase_info.numer) / timebase_info.denom;
cout << "Have a real conversion value" << endl;
}
else
{
nano = abs;
cout << "Both numerator and denominator are 1" << endl;
}
cout << "milliseconds = " << nano/1000000LL << endl;
}