【发布时间】:2011-10-28 17:58:27
【问题描述】:
我正在用 java 为基于移动 android 的设备编写一个网络服务器。
这个网络服务器是单线程的,遵循 nginx、node.js 和类似的思想:不要产生多个线程,只需在事件循环中使用异步操作。
虽然使用多线程网络服务器可能会在 x86 最近的 cpu 上提供更好的性能,但在基于 arm 的单核 cpu 上需要做更多的工作。
澄清一下,我非常了解 C 并且我已经在纯 c 中实现了单线程 Web 服务器,或者在 C# 中实现了多线程 Web 服务器,利用了 Windows 上的 IOPS,但我只用 Java 编写了一个简单的 Web 服务器,我想换成这个新的。
现在,我正在使用 java nio,并且我读到 ByteBuffer 在转换为字符串时非常慢,但这不是问题,因为我不需要这样做,事实上,我想要的 gaix 最大性能实现字节级别的解析和比较。
我的问题是,哪种解析字节缓冲区的方法更快?
我已经看到 ByteBuffer 支持 get 方法,可以访问单个字节并向前移动光标,支持数组方法,返回后备数组,所以我的问题是哪种方法更快?
我可以直接在 backed array 上工作,还是应该避免使用 get?
我想实现一个 ByteBufferPool 来重用字节缓冲区,我会使其具有线程感知能力,请阅读下文,这可能是一个问题吗?
在某些情况下,我会逐字节比较,应用掩码来处理区分大小写(我的意思是,如果第一个字节是 G,第三个是 T,第四个是空格(0x47、0x54 和 0x20)我可以将请求视为 GET 请求),在其他情况下,我需要将字符串与字节数组进行比较,例如标头(我将遍历字符串字符,将它们转换为字节并与字节进行比较)。
抱歉这些愚蠢的问题,但我不知道 java 规范,也不知道内部 java 的东西,所以我需要信息 :)
有人可以给个提示吗? :)
PS:显然,并非所有操作都可以以 do-stuff-pause-continue-return 方式处理,因此我将实现一个 ThreadPool 以避免线程创建惩罚
【问题讨论】:
标签: java android webserver nio bytebuffer