- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
出于某些原因,我需要根据时间戳计数器 (TSC) 来测量时间。要阅读 TSC,我使用以下代码:
#include <stdio.h>
#include <inttypes.h>
inline volatile uint32_t RDTSC32() {
register uint32_t TSC asm("eax");
asm volatile (".byte 15, 49" : : : "eax", "edx");
return TSC;
}
inline volatile uint64_t RDTSC64() {
register uint64_t TSC asm("rax");
asm volatile (".byte 15, 49" : : : "rax", "rdx");
return TSC;
}
int main() {
while (1) {
printf("%" PRIu64 "\n", RDTSC64());
}
}
当我测试它时,它工作正常。除了一件事。当它达到最大计数器值(在我的环境中,某个值高于 4,256,448,731)时,计数器值将重置为 0 并继续运行。
在这种情况下,有什么办法可以看到TSC重置了多少次?
例如,下面的代码没有打印出正确的时差:
#include <stdio.h>
int main() {
long long start, end;
start = RDTSC64();
// long long works to do
end = RDTSC64();
printf("%lld \n", end - start);
}
最佳答案
时间戳计数器始终是 64 位的,请参阅此声明 on the Wipedia page :
The Time Stamp Counter (TSC) is a 64-bit register present on all x86 processors since the Pentium.
出于某种原因,您得到一个只有 32 位的截断值,这就是它换行的原因。 64 位值需要在 4 GHz 下连续计数 146 年才能回绕。
您的代码似乎想同时使用 eax
和 edx
来保存两个 32 位的一半,正如预期的那样。将值移动到单个 C 变量时一定是出了什么问题。我相信您使用的片段是针对 GCC 的;也许那不再是您的编译器?
检查生成的程序集,并改为检查编译器文档以获得正确的内部函数。 This question有一些很好的答案,带有特定于编译器的程序集。
关于c - 如何确定时间戳计数器 (TSC) 重置了多少次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27164284/
给定一个带有多个 date_time 戳的字符串,我想 提取第一个戳及其前面的文本 候选字符串可以有一个或多个时间戳 后续的 date_time 戳记将被 sep="-" 隔开 后续date_time
是否可以合并从相机拍摄的文本和照片?我想在照片上标记日期和时间,但我在 Google 上找不到任何内容。 最佳答案 使用下面的代码来实现你所需要的。 Bitmap src = Bitm
有没有办法通过 Graph API 戳另一个用户?基于this post ,并使用 Graph Explorer ,我发布到“/USERID/pokes”,我已经授予它(Graph API 应用程序和
我有两个向左浮动的元素。一个是 body 的第一个 child ,另一个是容器的第一个 child ,容器是 body 的第二个 child 。 ...
我是一名优秀的程序员,十分优秀!