64,649
社区成员
发帖
与我相关
我的任务
分享
<span style="font-family:Courier New;">#include <stdio.h>
#include <hash_map>
#include <map>
#include <time.h>
#include <iostream>
#include <Windows.h>
#include <stdlib.h>
#include <winternl.h>
using namespace std;
#define PACKETS_COUNT 2000000
// Struct of response packet
typedef struct _PACKET_RESPONSE_
{
int packetNum; // The num of current packet
int count404; // The count of 404 Not Found
clock_t clockTick; // The clock tick of the packet that start at the process opened
}PACKET_RESPONSE;
typedef map<unsigned int, _PACKET_RESPONSE_*> RESPONSE_HASH_MAP;
PACKET_RESPONSE **response = {NULL};
// 插入
int insert(RESPONSE_HASH_MAP &responseHashMap)
{
for (int i=0; i<PACKETS_COUNT; i++)
{
PACKET_RESPONSE *newPacketResponse = *(response+i);
newPacketResponse->count404 = i;
newPacketResponse->packetNum = i;
newPacketResponse->clockTick = clock();
responseHashMap.insert(RESPONSE_HASH_MAP::value_type(i, newPacketResponse));
}
cout << "OK!" << endl;
return 0;
}
// 查找
int find(RESPONSE_HASH_MAP::iterator &iter, RESPONSE_HASH_MAP *responseHashMap, int key)
{
iter = responseHashMap->find(key);
if (responseHashMap->end() == iter)
{
cout << "not find!" << endl;
return -1;
}
cout << "find OK !\nKey: " << key << "\ncount404: " << iter->second->count404 << "\npacketNum: " << iter->second->packetNum << "\nclockTick: " << iter->second->clockTick << endl;
}
// 遍历
int visit(RESPONSE_HASH_MAP &responseHashMap)
{
int MaxPacketNum = 0;
RESPONSE_HASH_MAP::iterator iter = responseHashMap.begin();
while (responseHashMap.end() != iter)
{
if (MaxPacketNum < iter->second->packetNum)
{
MaxPacketNum = iter->second->packetNum;
}
++iter;
}
cout << "MaxPacketNum is: " << MaxPacketNum << endl;
return 0;
}
// 清理
int clear(RESPONSE_HASH_MAP &responseHashMap)
{
if (0 != responseHashMap.size())
{
responseHashMap.clear();
}
return 0;
}
DWORD getCpuUsage()
{
MEMORYSTATUS ms;
::GlobalMemoryStatus(&ms);
return ms.dwMemoryLoad;
}
int main()
{
response = new PACKET_RESPONSE*[PACKETS_COUNT];
clock_t t = clock();
for (int i=0; i<PACKETS_COUNT; i++)
{
response[i] = new PACKET_RESPONSE;
}
cout << "======================> clock is:" << clock()-t << endl;
RESPONSE_HASH_MAP responseHashMap;
RESPONSE_HASH_MAP::iterator iter = responseHashMap.begin();
DWORD dwStart = getCpuUsage();
clock_t start = clock();
insert(responseHashMap);
cout << "====> insert clock is: " << clock()-start << " ms" << endl;
DWORD dwInsert = getCpuUsage();
cout << "insert 内存使用率为: " << dwInsert-dwStart << "%" << endl;
RESPONSE_HASH_MAP::iterator it = responseHashMap.begin();
clock_t eraseStart = clock();
for (int i=0; i<1000; i++)
{
PACKET_RESPONSE *newNode = new PACKET_RESPONSE;
newNode->packetNum = PACKETS_COUNT + i;
newNode->count404 = PACKETS_COUNT + i;
newNode->clockTick = clock();
responseHashMap.insert(RESPONSE_HASH_MAP::value_type(PACKETS_COUNT + i, newNode));
it = responseHashMap.erase(it);
}
cout << "=====> erase clock is: " << clock()-eraseStart << " ms" << endl;
clock_t findStart = clock();
find(iter, &responseHashMap, PACKETS_COUNT-1);
cout << "====> find clock is: " << clock()-findStart << " ms" << endl;
DWORD dwFind = getCpuUsage();
cout << "find 内存使用率为: " << dwFind - dwInsert << "%" << endl;
clock_t visitStart = clock();
visit(responseHashMap);
cout << "====> visit clock is: " << clock()-visitStart << " ms" << endl;
DWORD dwVisit = getCpuUsage();
cout << "visit 内存使用率为:" << dwVisit << "%" << endl;
clock_t clearStart = clock();
clear(responseHashMap);
cout << "======> clear clock is: " << clock()-clearStart << " ms" << endl;
DWORD dwClear = getCpuUsage();
cout << "clear 内存使用率为:" << dwClear << "%" << endl;
return 0;
}</span>