众所周知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函数的实现 | 学步园相关推荐

  1. 一个ntohs函数的实现

    众所周知ntohs用来将本机字节序列转换为网络字节序列,如何写一个高性能的实现呢? 先写一个能正常工作的: 代码如下 short myntohs(short s) { BYTE high=(BYTE) ...

  2. 用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:4不能在第三位,3与5不能相连。...

    最近在看算法,看到这个题,觉得挺经典的,收起. 分析: 1 .把问题归结为图结构的遍历问题.实际上6个数字就是六个结点,把六个结点连接成无向连通图,对于每一个结点求这个图形的遍历路径,所有结点的遍历路 ...

  3. liunx java font_Linux下JDK中文字体乱码 | 学步园

    问题描述: 部署在linux下的java应用程序中的中文会变成一个一个的"口"字,也就是乱码 问题分析: 代码中使用了如下的实现方式: newjava.awt.Font(" ...

  4. java构造字符缓冲区_java学习笔记 | 学步园

    一.数组 类型[] 名称=new 类型[长度] 二.字符串2.1字符串类Stringjava.lang.StringString 名称=new String("xxxx")=&qu ...

  5. java压缩成.tar_java压缩tar.gz | 学步园

    zlib.gzip.zip这三个概念的确比较容易混淆: zlib是一种数据压缩程序库,它的设计目标是处理单纯的数据(而不管数据的来源是什么). gzip是一种文件压缩工具(或该压缩工具产生的压缩文件格 ...

  6. java gnu_GNU/Linux下Java开发环境的安装和配置 | 学步园

    首先下载JDK,在http://www.oracle.com/technetwork/java/javase/downloads/index.html下载最新版本的JDK,选择平台为linux,就会得 ...

  7. java 读取csv_Java读取CSV的常用方法 | 学步园

    在项目开发中,我们经常需要读取csv的内容的操作.读取的逻辑并不复杂.主要是对有换行的,逗号,引号的处理恰当的话就没问题了. 下面作为memo,把在项目中的读取方法拷贝了过来.有了下面的这些方法,在C ...

  8. java classpath bat_tomcat启动批处理——setclasspath.bat | 学步园

    除了上面两个批处理,还有一个比较重要的脚本,即是setclasspath.bat,它主要负责寻找.检查JAVA_HOME和JRE_HOME两个变量. ************************* ...

  9. java treetable_在Swing中创建TreeTable | 学步园

    TreeTable是Tree和Table的一个结合- 就是一个即能够展开和收起行,同时也能够显示多个列的组件.在Swing的标准包里没有一个叫做JtreeTable的组件,但是我们很容易通过把Jtre ...

最新文章

  1. Windows Server 2012 R2 WSUS-13:部署二级WSUS
  2. BAT华为美团头条面试考什么?这份GitHub万星资源,告诉你面试题+答案+出题人分析...
  3. 簡單安裝軟件 GNU Linux
  4. C、C++不定参数的使用
  5. Fiddler进行模拟Post提交json数据,总为null解决方式
  6. Java 并发编程阅读笔记
  7. 使用swiftenv管理swift版本
  8. contenteditable属性让div也可以当做输入框
  9. js判断手机横竖屏【转】
  10. exception(359): error C2220: 警告被视为错误 - 没有生成“object”文件
  11. SAP接口编程 之 JCo3.0系列:JCoDestination
  12. ideaIU-2019.3.3 百度云下载链接
  13. IO-4、RAID结构
  14. html/css插入base64背景图片
  15. 如何自建微信外卖平台_怎么做微信外卖小程序_微信外卖小程序创建图文教程...
  16. 线性回归,逻辑回归个人总结
  17. WordPress主题-一个极简的免费WordPress博客主题
  18. python表情换头_使用Python制作表情包实现换脸功能
  19. oracle数据库exp/imp导出导入数据
  20. 2010-11-30 Proview end date!

热门文章

  1. 说说你理解的分布式数据库
  2. 2147483647
  3. Matlab之阵列分析传感器sensorArrayAnalyzer工具箱
  4. 个人认为老罗的思路非常好
  5. 在Excel VBA中写SQL,是一种什么体验
  6. Share Creators 对于游戏行业资源存储、管理的痛点的分析
  7. 手机厂商的新宠骁龙888 Plus,掀起下半年旗舰手机市场热潮
  8. wpf中DataGrid的样式
  9. Linux - 查看磁盘空间占用
  10. 7-2 输出列表中最大元素的位置