java ntohs_一个ntohs函数的实现 | 学步园
众所周知ntohs用来将本机字节序列转换为网络字节序列,如何写一个高性能的实现呢?
先写一个能正常工作的:
代码如下
short myntohs(short s)
{
BYTE high=(BYTE)s>>8;
BYTE lower=(BYTE)s;
s=lower<<8+high;
return s;
}
int main(int argc, char* argv[])
{
printf("Hello World!/n");
short n=255;
int nMax=10000000;
DWORD dwBegin=GetTickCount();
for(int i=0;i
myntohs(255);
printf("%d/n",GetTickCount()-dwBegin);
dwBegin=GetTickCount();
for(i=0;i
ntohs(255);
printf("%d/n",GetTickCount()-dwBegin);
return 0;
}
执行后与系统自带的对比性能,运行时间输出如下:
219
62
性能相差很多呀,看来得用汇编写个改进版本
short myntohs1(short s)
{
__asm
{
movzx eax,word ptr [ebp+8]
mov ch,al
shr ax,8
or ah,ch
mov s,ax
}
return s;
}
运行结果如下:
188
62
性能有所改进,但与系统实现比较依然很慢,并没有显著改进性能,看来还得改进,应该是prolog代码和epilog代码所导致的性能不佳,
只好动用naked的了,将函数属性设置为naked。
short _declspec(naked) myntohs1(short s)
{
__asm
{
push ebp
mov ebp,esp
movzx eax,word ptr [ebp+8]
mov ch,al
shr ax,8
or ah,ch
pop ebp
ret
}
}
运行比较
47
62
性能比系统的更好呀,my god :)
以上运行结果数据都是在debug版本下得出来的,release版本情况好像差不多,以上三种方式性能数据如下:
32
31
31
可见编译器的优化功能非常强大。
java ntohs_一个ntohs函数的实现 | 学步园相关推荐
- 一个ntohs函数的实现
众所周知ntohs用来将本机字节序列转换为网络字节序列,如何写一个高性能的实现呢? 先写一个能正常工作的: 代码如下 short myntohs(short s) { BYTE high=(BYTE) ...
- 用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:4不能在第三位,3与5不能相连。...
最近在看算法,看到这个题,觉得挺经典的,收起. 分析: 1 .把问题归结为图结构的遍历问题.实际上6个数字就是六个结点,把六个结点连接成无向连通图,对于每一个结点求这个图形的遍历路径,所有结点的遍历路 ...
- liunx java font_Linux下JDK中文字体乱码 | 学步园
问题描述: 部署在linux下的java应用程序中的中文会变成一个一个的"口"字,也就是乱码 问题分析: 代码中使用了如下的实现方式: newjava.awt.Font(" ...
- java构造字符缓冲区_java学习笔记 | 学步园
一.数组 类型[] 名称=new 类型[长度] 二.字符串2.1字符串类Stringjava.lang.StringString 名称=new String("xxxx")=&qu ...
- java压缩成.tar_java压缩tar.gz | 学步园
zlib.gzip.zip这三个概念的确比较容易混淆: zlib是一种数据压缩程序库,它的设计目标是处理单纯的数据(而不管数据的来源是什么). gzip是一种文件压缩工具(或该压缩工具产生的压缩文件格 ...
- java gnu_GNU/Linux下Java开发环境的安装和配置 | 学步园
首先下载JDK,在http://www.oracle.com/technetwork/java/javase/downloads/index.html下载最新版本的JDK,选择平台为linux,就会得 ...
- java 读取csv_Java读取CSV的常用方法 | 学步园
在项目开发中,我们经常需要读取csv的内容的操作.读取的逻辑并不复杂.主要是对有换行的,逗号,引号的处理恰当的话就没问题了. 下面作为memo,把在项目中的读取方法拷贝了过来.有了下面的这些方法,在C ...
- java classpath bat_tomcat启动批处理——setclasspath.bat | 学步园
除了上面两个批处理,还有一个比较重要的脚本,即是setclasspath.bat,它主要负责寻找.检查JAVA_HOME和JRE_HOME两个变量. ************************* ...
- java treetable_在Swing中创建TreeTable | 学步园
TreeTable是Tree和Table的一个结合- 就是一个即能够展开和收起行,同时也能够显示多个列的组件.在Swing的标准包里没有一个叫做JtreeTable的组件,但是我们很容易通过把Jtre ...
最新文章
- Windows Server 2012 R2 WSUS-13:部署二级WSUS
- BAT华为美团头条面试考什么?这份GitHub万星资源,告诉你面试题+答案+出题人分析...
- 簡單安裝軟件 GNU Linux
- C、C++不定参数的使用
- Fiddler进行模拟Post提交json数据,总为null解决方式
- Java 并发编程阅读笔记
- 使用swiftenv管理swift版本
- contenteditable属性让div也可以当做输入框
- js判断手机横竖屏【转】
- exception(359): error C2220: 警告被视为错误 - 没有生成“object”文件
- SAP接口编程 之 JCo3.0系列:JCoDestination
- ideaIU-2019.3.3 百度云下载链接
- IO-4、RAID结构
- html/css插入base64背景图片
- 如何自建微信外卖平台_怎么做微信外卖小程序_微信外卖小程序创建图文教程...
- 线性回归,逻辑回归个人总结
- WordPress主题-一个极简的免费WordPress博客主题
- python表情换头_使用Python制作表情包实现换脸功能
- oracle数据库exp/imp导出导入数据
- 2010-11-30 Proview end date!