对付虚拟执行

     如何判断我们程序 是不是在一个虚拟的CPU上执行 或者说在一个 模拟的 CPU 上执行 。。。很久以前就有人说使用 执行时间来判断。。。

   由于是模拟的执行 所以速度比真是机器满了不少。。。

看看下面的程序

#include <stdio.h>

#include <sys/types.h>  // for int64_t

#include <sys/time.h>

#include <sys/resource.h>

int64_t rdtsc()

{
	__asm__ __volatile__("RDTSC\t\n");  // -O3  will be inline func

}



int main(int argc,char **argv)

{

	int i = 0;

	int64_t start;

	setpriority(PRIO_PROCESS, 0, -20);

	start = rdtsc();

	//__asm__("int 3\n");



	for (i = 0; i < 100; ++i)

	{

		__asm__ __volatile__("pushad\n"

			"pushfd\n"

			"popfd\n"

			"popad\n");

	}



	printf("%llu\n",rdtsc() - start );

	return 0;

}
编译下

gcc rtdsc.c -masm=intel

注意 不能使用 -O 优化编译 。。。。不然 gcc 会把上面的 rtdsc 函数变成 内联的  导致执行结果错误

计时的过程是 100 次无用循环

这个时间是非常的短的  但是为了减少这么短的时间内 系统把CPU 切换出去 的可能性 开始设置了下 程序的 nice

setpriority(PRIO_PROCESS, 0, -20);
将优先级设置成最高

在我的 B980 垃圾奔腾机器上 结果

是 4480 左右

注意执行的时候要绑定下 CPU 不然 rdtsc 指令可能两次获得不是同一个CPU的周期数

[root@centos ~]# taskset -c 0  ./a.out

现在换到虚拟机上面试试。。。

换到 vitualbox 上运行的 centos 上面 。。

由于我机器CPU没用 VT-x 功能 所以virtualbox 就是模拟执行指令的。。。

看了下结果 稳定在6000+

可以看出 性能损失了  30% +  和以前看到的一个关于 virtualbox 的测评貌似一样。。。。



你可能感兴趣的:(对付虚拟执行)