2010年12月29日星期三

Visual Studio 插件推介–metalscroll

早前我曾經介紹過 RockScroll 這個插件,如今我找到了一個更好的代替品 metalscroll

它比起 RockScroll 有很多細節的改善,最重要是掛掉的情況沒有了。

2010年2月24日星期三

讓工作管理員進行繪圖

興之所致,找來一個有趣面試題目來解答:如何能讓CPU 的使用率表現為一條正弦曲線?

這個題目來自《编程之美--微软技术面试心得》,有機會的我會話買下來當作娛樂。

// This program try to burn cpu cycles with a sinusoid function against the time.
#include <MCD/Core/System/TaskPool.h>
#include <MCD/Core/System/Timer.h>
#include <math.h>

class Task : public MCD::TaskPool::Task {
public:
Task(float frequency) : MCD::TaskPool::Task(0), mFrequency(frequency) {}

sal_override void run(MCD::Thread& thread) throw() {
MCD::Timer timer;
while(thread.keepRun()) {
double current = timer.get().asSecond();
double busy = (sin(current * mFrequency) + 1) / 2;
double idle = 1 - busy; // We base on a 1 second interval
while(timer.get().asSecond() < current + busy) {} // Burn CPU cycles
MCD::mSleep(int(idle * 1000)); // Let CPU idle
}

// The Task instance is not needed any more, destroy it.
delete this;
}

float mFrequency;
}; // Task

int main(int, char const*[])
{
const size_t cpuCount = 4; // Set this to match your hardware thread count
const float frequency = 0.1f;

MCD::TaskPool taskPool;
taskPool.setThreadCount(cpuCount);

for(size_t i=0; i<cpuCount; ++i)
taskPool.enqueue(*new Task(frequency));

std::cout << "Press enter to quit...\n";
std::cin.get();

taskPool.stop();

return 0;
}

sinusoidTaskManager

註:中間的那個高峰因突如其來的 MSN 短訊耗掉了整整一個 CPU Core 而缺了一角。