转自:http://bbs.csdn.net/topics/360111289, 有改动。

#include <windows.h>
#include <stdio.h>
#include <process.h>
#include<memory>
#pragma comment(lib,"ws2_32.lib")

ULONGLONG g_nReadCounts=0,g_nWriteCounts=0,g_nOtherCounts=0,g_nReadsBytes=0,g_nWriteBytes=0,g_nOtherBytes=0;
void PrintIODetails() 
{
	static DWORD lastTickCount;
	static IO_COUNTERS lastIoCounters;
	DWORD tickCount;
	IO_COUNTERS ioCounters;
	static int firstTime = 1;

	tickCount = GetTickCount();
	if (!GetProcessIoCounters(GetCurrentProcess(), &ioCounters)) {
		return;
	}

	if (firstTime) 
	{
		firstTime = 0;
		printf("    Time    Reads   Writes   Others     Read(Bytes)    Write(Bytes)    Other(Bytes)\n");
		printf("--------------------------------------------------------------------------------\n");
	}
	else 
	{
		printf("%8lu%8llu%8llu%8llu%16llu%16llu%16llu\n",
			tickCount - lastTickCount,
			ioCounters.ReadOperationCount - lastIoCounters.ReadOperationCount,
			ioCounters.WriteOperationCount - lastIoCounters.WriteOperationCount,
			ioCounters.OtherOperationCount - lastIoCounters.OtherOperationCount,
			ioCounters.ReadTransferCount - lastIoCounters.ReadTransferCount,
			ioCounters.WriteTransferCount - lastIoCounters.WriteTransferCount,
			ioCounters.OtherTransferCount - lastIoCounters.OtherTransferCount
			);

		g_nReadCounts += (ioCounters.ReadOperationCount - lastIoCounters.ReadOperationCount);
		g_nWriteCounts += (ioCounters.WriteOperationCount - lastIoCounters.WriteOperationCount);
		g_nOtherCounts += (ioCounters.OtherOperationCount - lastIoCounters.OtherOperationCount);
		g_nReadsBytes += (ioCounters.ReadTransferCount - lastIoCounters.ReadTransferCount);
		g_nWriteBytes += (ioCounters.WriteTransferCount - lastIoCounters.WriteTransferCount);
		g_nOtherBytes += (ioCounters.OtherTransferCount - lastIoCounters.OtherTransferCount);
	}

	lastTickCount = tickCount;
	memcpy(&lastIoCounters, &ioCounters, sizeof(IO_COUNTERS));
}
#define PACKCOUNT 10
#define BUFFSIEZ 50000
volatile bool bWorkThreadFinish = false;
void workerThread(void * dummy) 
{
	int i;
	FILE * fp;
	char buff[BUFFSIEZ];
	WSADATA wsaData;
	SOCKET s;
	struct sockaddr_in localAddr;
	struct sockaddr_in peerAddr;

	memset(buff, 'X', sizeof(buff));

	Sleep(2000);

	// 写文件
	fp = fopen("io.txt", "w");
	if (fp) {
		printf("fwrite = %d\n", fwrite(buff, 1, sizeof(buff), fp));
		Sleep(10000);
		// 关闭文件,测试Flush
		printf("fclose\n");
		fclose(fp);
		Sleep(2000);
	}

	// 读文件
	fp = fopen("io.txt", "r");
	if (fp) {
		printf("fread = %d\n", fread(buff, 1, sizeof(buff), fp));
		fclose(fp);
		Sleep(2000);
	}

	// 网络发

	memset((void *)&localAddr, 0, sizeof(localAddr));
	localAddr.sin_family = AF_INET;
	localAddr.sin_addr.s_addr = htonl(INADDR_ANY);
	localAddr.sin_port = htons(0);
	memset((void *)&peerAddr, 0, sizeof(peerAddr));
	peerAddr.sin_family = AF_INET;
	peerAddr.sin_addr.s_addr = inet_addr("10.19.85.1");
	peerAddr.sin_port = htons(3389);

	printf("WSAStartup\n");
	WSAStartup(MAKEWORD(2, 2), &wsaData);
	Sleep(2000);

	// UDP
	printf("UDP Test:\n");
	printf("socket\n");
	s = socket(AF_INET, SOCK_DGRAM, 0);
	Sleep(2000);

	printf("bind\n");
	bind(s, (struct sockaddr *)&localAddr, sizeof(localAddr));
	Sleep(2000);
	for (i = 0; i < PACKCOUNT; i++) {
		printf("sendto = %d\n", sendto(s, buff, i * 100, 0, (SOCKADDR *) &peerAddr, sizeof(peerAddr)));
		Sleep(2000);
	}
	printf("closesocket\n");
	closesocket(s);
	Sleep(2000);

	// TCP
	printf("TCP Test:\n");
	printf("socket\n");
	s = socket(AF_INET, SOCK_STREAM, 0);
	Sleep(2000);

	printf("bind\n");
	bind(s, (struct sockaddr *)&localAddr, sizeof(localAddr));
	Sleep(2000);

	printf("connect\n");
	connect(s, (SOCKADDR *) &peerAddr, sizeof(peerAddr));
	Sleep(2000);

	printf("send = %d\n", send(s, buff, sizeof(buff), 0));
	Sleep(2000);

	printf("closesocket\n");
	closesocket(s);
	Sleep(2000);

	printf("WSACleanup\n");
	WSACleanup();

	bWorkThreadFinish = true;
}

UINT _stdcall ThreadProc(PVOID pv)
{
	workerThread(pv);
	return 1;
}
//HANDLE g_hEvt = NULL;
int main(int argc, char ** argv) 
{
	// 启动工作线程
	::_beginthreadex(NULL,0,ThreadProc,NULL,0,0);

	//g_hEvt = ::CreateEventW(NULL,FALSE,FALSE,NULL);
	

	printf("Ctrl-C to exit\n\n");
	for (;;) 
	{
		PrintIODetails();
		Sleep(1000);
		if (bWorkThreadFinish)
		{
			break;
		}	
	}
	printf("*********************************Total*************************************\n");
	printf("    Reads   Writes   Others     Read(Bytes)    Write(Bytes)    Other(Bytes)\n");
	printf("%8llu%8llu%8llu%16llu%16llu%16llu\n",
		g_nReadCounts,
		g_nWriteCounts,
		g_nOtherCounts,
		g_nReadsBytes,
		g_nWriteBytes,
		g_nOtherBytes
		);
	return 0;
}

Windows IO 性能简单测试的更多相关文章

  1. 记一次虚拟化环境下Windows IO性能的解析

    前言随着云计算技术与服务的发展和进步,越来越多的客户选择将业务部署到云端.但由于引入了虚拟化层,在业务部署过程中经常会遇到IO问题,通常也不易调试.本文主要介绍利用perf.systemtap等工具, ...

  2. MySQL中MyISAM引擎与InnoDB引擎性能简单测试

    [硬件配置]CPU : AMD2500+ (1.8G)内存: 1G/现代硬盘: 80G/IDE[软件配置]OS : Windows XP SP2SE : PHP5.2.1DB : MySQL5.0.3 ...

  3. windows上测试磁盘io性能

    一.问题由来 前两天搭建一套演示环境,同样的java war包,放在我们这边服务器好好的,放在那边就运行缓慢. 后来把日志改成异步之后就好了. 后边找了个程序测了下io性能,竟然差了7,8倍. 二.软 ...

  4. 磁盘IO性能监控(Linux 和 Windows)

    磁盘IO性能监控(Linux 和 Windows) 作者:终南   <li.zhongnan@hotmail.com> 磁盘的IO性能是衡量计算机总体性能的一个重要指标.Linux提供了i ...

  5. Linux如何查看与测试磁盘IO性能

    1. 查看磁盘 IO 性能 1.1 top 命令 top 命令通过查看 CPU 的 wa% 值来判断当前磁盘 IO 性能,如果这个数值过大,很可能是磁盘 IO 太高了,当然也可能是其他原因,例如网络 ...

  6. Linux 如何测试 IO 性能(磁盘读写速度)

    这几天做MySQL性能测试,偌大一个公司,找几台性能测试机器都很纠结,终于协调到两台,IO的性能如何还不知道.数据库属于IO密集型的应用,所以还是先评估下Server的IO性能,看看是否能和线上的机器 ...

  7. 在Windows中监视IO性能

    附:在Windows中监视IO性能 本来准备写一篇windows中监视IO性能的,后来发现好像可写的内容不多,windows在细节这方面做的不是那么的好,不过那些基本信息还是有的. 在Windows中 ...

  8. windows集群简单介绍

    windows集群简单介绍仔细看过以前网友发表的一些文章,总觉得对windows集群没有详细介绍,我也是借花献佛,引用了一些技术性文档.目前应用最为广泛的集群计算技术可以分为三大类:高可用性集群技术. ...

  9. 在Linux中监视IO性能

    dd命令 iostat命令 理解iostat的各项输出 iostat的应用实例 附:在Windows中监视IO性能 延伸阅读 dd命令 dd其实是工作于比较低层的一个数据拷贝和转换的*nix平台的工具 ...

随机推荐

  1. python函数参数类型及其顺序

    根据inspect模块官文文档中关于函数参数类型的相关说明,python函数参数共有五种类型,按顺序分别为:POSITIONAL_ONLY.POSITIONAL_OR_KEYWORD.VAR_POSI ...

  2. sqoop导数

    #!/bin/bash source ExitCodeCheck.shopts=$@getparam(){ echo $opts|xargs -n1|cut -b 2-|awk -v arg=$1 - ...

  3. 如何制作高水平简历?&& 制作简历时需要注意的问题

    1. 投递简历时一定要署名.  无论是简历的名称还是投递到邮箱时的名称,都需要说明重要信息,即 姓名-职位-学校-专业 . 这样,hr在筛选.录入简历时可以很方便查找简历,这样也可以给hr.面试官一个 ...

  4. Unity游戏接入Steam成就

    在接入Steam成就,其实有些地方是有坑点的,而且steam官网给的是c++代码的接入教程.如果是老鸟的话,接入还并不是很难. 但是对于新手其实还是比较痛苦的,网上这方面的资料很少.这里我给总结下,u ...

  5. 更好的理解MVC

    mvc除了将数据层和逻辑层分离外,还有更好的优化了代码结构 m只和c交互,v也只和c交互,m与v的交互需要通过c,一共只用考虑4条路 如果不是这样的话,m v c需要考虑和每个人交互,那么就是要考虑 ...

  6. WPF事件中的sender就是事件源

    可以看到wpf中所有的事件都是这个格式: private void btnTest_Click(object sender, RoutedEventArgs e)  { Button btn = (B ...

  7. git 自己创建了一个项目A,我的同事fork一个B,当我的项目更新的时候,怎么样在他fork的repo上进行相应的更新?

    先把B clone到本地 git clone B_REPOSITORY_URL 再cd到本地B的目录,把A作为一个remote加到本地的B中(一般命名为upstream) git remote add ...

  8. 第一次尝试用ANT进行build

    虽然是软件工程专业学生,但很多东西都才刚刚接触,有些惭愧,但我相信“Later better than never”,所以我还是鼓励自己不断学习,以后尽量把自己新学会的东西记录下来,以此来督促自己的学 ...

  9. css常用左右布局方案整理

     实际项目开发过程中我们经常会遇到页面div左右布局的需求:左侧 div 固定宽度,右侧 div 自适应宽度,填充满剩余页面,下面整理几种常用的方案  1 左侧 div 设置 float 属性为 le ...

  10. [android] 网络链接类型和渠道

    1.实现方式 1.1使用HttpUrlConnection 1.2使用HttpClient 1.3使用Socket,比如:豌豆荚,聊天工具 2.通讯渠道 2.1 WLAN(wi-fi),100米左右的 ...