Ejemplo n.º 1
0
int TimerTestEntry(int argc, char* argv[])
{
	Timer* timer = new ListTimer();
		
	srand(time(NULL));

	int i = 0;
	int num = atoi(argv[1]);
	g_pCounter = new int[num];
	while (i++ < num)
	{
		int interval = 20 + rand() % (3600 * 1000 - 20);
		int iTimerId = timer->AddTimer(interval, OnTimer, true);
		printf("Timer-%d start, every %d msecond.\n", iTimerId, interval);
	}

	while (true)
	{
		zues::Sleep(1000000);
	}

	int nCount = atoi(argv[2]);
	int iDelayUSec[] = {
		500 * 1000, 
		100 * 1000, 
		50 * 1000,
		10 * 1000,
		5 * 1000, //select会10ms返回
		2 * 1000,
		//不再准确
		2 * 1000,
		1 * 1000,
		100, 
		10,
		1
	};
	int& nDelay = iDelayUSec[atoi(argv[1])];
	BEGIN_COST_CALCULATE("select");
	struct timeval delay;
	while (i < nCount)
	{
		delay.tv_sec = 0;
		delay.tv_usec = nDelay;
		select(0, NULL, NULL, NULL, &delay);
		i++;
	}
	END_COST_CALCULATE();

	BEGIN_COST_CALCULATE("usleep");
	i= 0;
	while (i < nCount)
	{
		usleep(nDelay);
		i++;
	}
	END_COST_CALCULATE();

	/*
	BEGIN_COST_CALCULATE("sleep");
	i= 0;
	while (i < 10)
	{
		sleep(1);
		i++;
	}
	END_COST_CALCULATE();
	*/

	BEGIN_COST_CALCULATE("nanosleep");
	i= 0;
	struct timespec req;
	struct timespec rem;
	rem.tv_sec = 0;
	rem.tv_nsec = 0;
	req.tv_sec = 0;
	req.tv_nsec = nDelay * 1000;

	while (i < nCount)
	{
		if (-1 == nanosleep(&req, &rem))
		{
			printf("%d, %d\n", rem.tv_sec, rem.tv_nsec);
			req.tv_sec = rem.tv_sec;
			req.tv_nsec = nDelay * 1000 + rem.tv_nsec;
		}
		else
		{
			req.tv_sec = 0;
			req.tv_nsec = nDelay * 1000;
		}
		i++;
	}
	END_COST_CALCULATE();

}