杂感:面对CPU的困惑
CPU种类真多
单核、双核、四核、八核……
90纳米、65纳米、35纳米……
再倒过来搞些个低功耗、Atom之类……
我不知道CPU有多强
可是,我怎么知道我的CPU到底有多强?而我的应用程序又到底要吃多少CPU?
说实话,我真的不知道;或者说到目前为止还不知道。
我不知道我写的代码怎样
一个严峻的问题:作为一个开发人员,多多少少会遇到性能的挑战;或者说每时每刻都会有来自性能的忧虑。
然而,每当我写下一行代码,我确实不知道这行代码到底要运行多少个时钟周期;如果我写下一个循环,我也不知道这个循环跑1000次到底要多久。
如果这些代码中还涉及到内存IO、硬盘IO甚至网络的话——好吧,恕我无在——我顶多能说,这里应该会是在10秒之内跑完。
应该能够找到一些办法
好吧,难道我、或者我们真的就只能坐着发呆了么?方法也还是有一些的吧,或者说是有一大堆的。
事实上,有很多或理论的、或实践的前辈、专家已经、或者正在作出努力,得出大堆的工具、方法、理论。
我想,我们凡人要做的,应该是挑选、学习、组合与应用。
好像是吧,好像不是
静下心来想想看,搜搜看:
好吧,学学看,兴许能懂,兴许能用。
我们一起来许愿
啊哈,作为开发人员,我们多么期望生在一个资源无限的世界啊!
笔记:Windows Code Page
Windows Code Page相关函数
| EnumSystemCodePages | Enumerates the code pages that are either installed on or supported by a system. |
| GetACP | Retrieves the current ANSI code page identifier for the operating system. |
| GetCPInfo | Retrieves information about any valid installed or available code page. |
| GetCPInfoEx | Retrieves information about any valid installed or available code page. |
| GetOEMCP | Retrieves the current original equipment manufacturer (OEM) code page identifier for the |
| IsValidCodePage | Determines if a specified code page is valid. |
Windows Code Page及其对应命名(中文部份、出处)
| Descriptive Title | Windows Code Page |
|---|---|
| Charset names (preferred name in bold) | |
| CESU-8 | |
| CESU-8, csCESU-8 | |
| Chinese National Standard (GB18030) | 54936 |
| GB18030, ISO-4873:1986 | |
| Chinese Simplified (EUC) | 51936 |
| EUC-CN, x-euc-cn | |
| Chinese Simplified (GB2312) | 936 |
| gb2312, chinese, CN-GB, csGB2312, csGB231280, csISO58GB231280, GB_2312-80, GB231280, GB2312-80, GBK, iso-ir-58, CP936, MS936, windows-936 | |
| Chinese Simplified (GB2312-80) | 20936 |
| x-cp20936 | |
| Chinese Simplified (HZ) | 52936 |
| hz-gb-2312 | |
| Chinese Simplified (ISO 2022) | 50227 |
| x-cp50227 | |
| Chinese Simplified (Mac) | 10008 |
| x-mac-chinesesimp | |
| Chinese Traditional (Big5) | 950 |
| big5, cn-big5, csbig5, x-x-big5, CP950, Big5-HKSCS | |
| Chinese Traditional (CNS) | 20000 |
| x-Chinese-CNS, x-Chinese_CNS | |
| Chinese Traditional (Eten) | 20002 |
| x-Chinese-Eten, x_Chinese-Eten | |
| Chinese Traditional (Mac) | 10002 |
| x-mac-chinesetrad | |
让Expat支持GBK
Expat是什么?
由第一届XML CUP获得者James Clark贡献的、鼎鼎大名的Expat XML解析器,基于SAX模型、解析效率极高。被众多知名软件用作XML解析模块。Expat自身以c代码的形式提供,但已有perl、python等多种移植版本。在很多系统中甚至成为了标配类库。
Expat与GBK
Expat内建支持UTF-8、UTF-16、大&小ASCII编码;很不幸,唯独不支持GBK编码。如果你需要使用Expat处理GBK编码XML的话,我有两点建议:
- 预先将GBK编码的XML文件转成Unicode文件;
- 利用Expat编码扩展机制进行扩展;
如果你选择第2种方案,执意要扩展Expat的话,也好办;参考以下步骤:
- 调用XML_SetUnknownEncodingHandler,声明处理UnknownEncoding事件;
- 实现UnknownEncoding事件处理程序;关键点为填充一个XML_Encoding结构;
- 实现GBK编码到Unicode的转换函数;
是的,就这么简单。
附录:
更新
- 20090327: expat源码包里有个demo: xmlwf,这个工程里已经演示了对于非内置编码的支持方式——有两个叫做codepage的文件,可以认真参考一下。
- 容我再啰嗦一句,出于性能考虑,我还是建议预先将GBK编码的XML文件或字符串先转成Unicode再进行处理。
链接:C++与Web Service
参考文档
如果使用VC调用Web Service则可以参考我以前发的小文档:
如果是要使用纯C进行Web Service开则稍有点繁:
开发工具
- PocketSOAP 注意:PocketSOAP is desgined for interop
- Microsoft ASP.NET Webservices - 这个不用说了吧
- Apache SOAP and Apache Axis - 分别为C++和Java实现
- Microsoft SOAP Toolkit v3.0 - MS的老东东,没用过
- IONA's XMLBus
- EasySOAP++
- SOAP::Lite - For PERLl
- Frontier
- gSoap
- GLUE
- 4s4c
服务提供
Windows远程桌面使用技巧
Windows提供的远程桌面服务应该说是一个比较实用的功能;特别是有多台机器需要管理的时候,远程桌面几乎必不可少。下面摘录几点Windows远程桌面使用过程中的小技巧。
基于MMC的远程连接客户端
Windows XP就自带远程连接客户端,其界面为每个连接独立一个窗口。当需要同时连接多台机器时,就会发现任条栏里多了好多窗口。
安装附录中的Admin Pack后,会多出来一个基于MMC的远程连接客户端,其界面如下图所示:
连接到控制台
在一些特殊的情况下,你可能希望你连接上去之后和机器本机显示器使用同一个会话(即远程连接之后就相当于在目标机器本机登录),那么可以在基于MMC的客户端更改连接的属性:
如果是基于系统自带的远程连接,则可以使用mstsc命令行工具:
- 如果是Windows XP则带上/console,例如:mstsc /console 192.168.1.1
- 如果是Windows 7则带上/admin,例表:mstsc /admin 192.168.1.1
对于其它版本方法类似,可以参考“mstsc /?”的提示:
在会话之间切换
有些时候,你可能连接了多个会话到同一个Windows上;再次登录的时候却发现搞错了会话,是不是要断开重连呢?其实你只要在按CTRL+ALT+END,调出目标机器上的任务管理器就可以随意跳来跳去了:
使用磁盘本机磁盘
我发现很多人会使用共享文件夹的方式在远程机器和本机之间共享文件。
其实,远程桌面功能允许你直接把磁盘、甚至本地打印机“连接到”远程机器:
附录
VS调试技巧两则
强制使用不匹配的源文件
如果没有正确设置pdb路径,又或者VS临时出个小毛病,调试人员难免会碰到因为源代码与pdb不匹配而不能命中断点的case。
其实,可以更改VS的调试选项,强制VS使用非精确匹配的源文件,如下图:
自定义Watch窗口显示格式
调试的时候在Watch窗口可以观察到很多信息,然而不知道你想没想过,Watch窗口里边每个条目的格式都是怎样确定的呢?
其实,Watch窗口用于格式化不同变量的定义都在这个文件里:%VSDir%Common7\Packages\Debugger\autoexp.dat。可以更改这个文件以达到自定义Watch窗口条目显式格式的目的。
autoexp.dat的语法可以看文件里边的注释;亦可参考:VC IDE中Watch窗口的特殊格式。
Xen bridge network trouble shooting tip~
Xen桥接网络非常灵活,然而逻辑和管理方面也还算简单。
桥接设备
- bridge, 网桥;一般起名为:xenbr0, xenbr1, etc.
- vif, 虚拟网络接口;一般起名为:vif0.0,vif0.1, etc.
- veth/eth, 虚拟网络设备;一般起名为:eth0, etc.
桥接工具
- /etc/xen/script/network-bridge, 网桥操作脚本
- /etc/xen/script/vif-bridge, 虚拟接口操作脚本
- brctl 工具,事实上以上两个脚本均调用了它
排查步骤
- brctl show; 再看桥接是否OK。
- ethtool peth; 先看物理网卡通不通。
- ifconfig vif; 看各虚拟接口是否正常。
- ifconfig eth/veth; 看看虚拟网络设备是否正常。
链接
Mono – Linux .NET CLR~
Mono 是什么?
Mono 是一个用于在 Linux, Solaris, Mac OS X, Windows 和 Unix 等系统上开发 .NET 应用的运行时环境(.NET CLR)。作为受到 Novell 赞助的开源项目, Mono 拥有活跃的社区力量,并有信心成为 Linux 应用开发的首要选择。
特性
- 真正的跨平台;
- 遵从 ECMA/ISO 标准;
- 完美支持 APS.NET 和 Winforms 应用;
- 跨语言(.NET, Java, Python, etc.)
- 开源,免费!
- 商业支持;
- 广泛的技术涵盖;
工具
MonoDevelop, Mono 开源项目之中包含的一个IDE工具,助您在 Linux 上轻松开发 .NET 应用。
图一、MonoDevelp IDE 屏幕截图
链接
注:本文主要内容编译自 Mono 官方网站。
Xen Networking~
Xen网络结构相当灵活,适当配置可以“轻松”实现dom0/domU与物理网络三者之间的复杂拓扑。
联接方式
- bridge 桥接模式,应用最广
- route
- nat
桥接模式
图一、Xen 桥接模式示意图