`
swanky_yao
  • 浏览: 31651 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

看高手代码--从小case学大道理

阅读更多
今天看sun的HttpMessages.java文件,虽然文件很小,但是对我的启发很大。
前面定义了大量的HTTP常量:
    ...
    ...
    private static final String STATUS_305 = "Use Proxy";
    private static final String STATUS_307 = "Temporary Redirect";
    private static final String STATUS_400 = "Bad Request";
    private static final String STATUS_401 = "Unauthorized";
    private static final String STATUS_402 = "Payment Required";
    private static final String STATUS_403 = "Forbidden";
    private static final String STATUS_404 = "Not Found";
    private static final String STATUS_405 = "Method Not Allowed";
    private static final String STATUS_406 = "Not Acceptable";
    private static final String STATUS_407 = "Proxy Authentication Required";
    private static final String STATUS_408 = "Request Timeout";
    ...
    ...

也可以趁机从这里查看HTTP返回值的意义^_^。然后定义了一个java.util.concurrent.ConcurrentHashMap的变量httpStatusCodeMappings,再往里面添加刚才定义的常量(这个操作放在了一个静态块里),如:
static {
        httpStatusCodeMappings.put("sc.100", STATUS_100);
        httpStatusCodeMappings.put("sc.101", STATUS_101);
        httpStatusCodeMappings.put("sc.200", STATUS_200);
        httpStatusCodeMappings.put("sc.201", STATUS_201);
        httpStatusCodeMappings.put("sc.202", STATUS_202);
        httpStatusCodeMappings.put("sc.203", STATUS_203);
  ...
  ...

最重要的就是这个方法了,先看代码
public static String getMessage(int status) {

        // Return the status message for the most frequently used status
        // codes directly, without any lookup
        switch (status) {
            case 200: return STATUS_200;
            case 302: return STATUS_302;
            case 400: return STATUS_400;
            case 404: return STATUS_404;
	}

        return httpStatusCodeMappings.get("sc."+ status);
    }

这段代码的用途很简单,就是要返回状态码对应的Message,而这些这些消息都已经存放在httpStatusCodeMappings变量里了,为了提高访问常用的几个返回码的Message,它直接用了一个静态块,而不去lookup那个map了,这就是高手!
分享到:
评论
96 楼 fengfeng925 2010-06-09  
arthas777 写道
iaimstar 写道
arthas777 写道
我很支持楼主!!
我以前做过j2me开发,我非常理解楼主的心情!
    顶你!
而且,我想对那些拿web不需要考虑细节性能的人说,你的web可能不支持高并发访问哦!


高并发和这个没啥主要关系好吧。 而且j2me和高并发更风马牛不相及。

j2me比较特殊,对各种资源 锱铢必较 是能理解的。


    j2me,锱铢必较,一种精神!高并发,优化中再优化,也是一种精神!
    自己写的程序,最后积累的成果,也是一种精神!
    你可以拿中国大环境来宣扬你的理论!
    我没有必要把问题上升来跟你计较什么!
    但你没有资格剥夺其他程序员的精神!
                       ~~~~~~~~~~~~~~~懂???
    另注:老美可以做出《使命召唤》,而中国永远也做不出来!因为像你这样的写程序的太多太多了!
          在这种恶劣环境摧残下,你已经沦为奴隶!
   
    再另注:如果不知道《使命召唤》是什么,也没关系,去搜搜它的开发历程和团队素养!你就知道自己有多可怜了!

哥们言辞太激烈了,没必要。
《使命召唤》中国人做不出来你的原因也太片面了。中国绝对不缺技术牛人,只说一方面原因:中国的游戏产业太急功近利,中国游戏动画产业发展时间短,还没有公司有这个实力,开发周期过长,小公司顶不住。
讨论规讨论。大家所处领域不同,开发方向也不同,所以适合自己的才是最好的。呵呵。
95 楼 syab11 2010-06-09  
方法值得学习,但是在实际开发中应该用的不多吧
94 楼 fengfeng925 2010-06-09  
ilove2009 写道
sw1982 写道
做业务和玩编程不是一个概念。如果你觉得计算几个hash也是性能浪费,真不如去汇编得了。

你可以尝试量化一下, 而且架构师通常会建议“先抗住再优化”,而《重构》这本书自身都建议,不到万不得已,不要优化代码的技巧!

skydream 写道
sw1982 写道
...lookup 一下hashmap真的那么低效吗? 建议复习下数据结构哦,你这些总结是没错,可是很表面


典型的没有写过高并发程序的思维方式,明明可以节约的地方,仅仅几行代码就可以优化,偏偏不做。

hashmap再快,也比case 一个 整型满上1w倍。

性能,是一点一点挤牙膏挤出来的,哪能到处浪费啊。



如果不懂的时候,怎么简单来就怎么来。如果有机会理解了别人的思想,碰到类似的场景也可以用下,未尝不可。

最近来了一个做互联网开发的公司,是大门户网站,公司名字不便透露。感觉做互联网开发跟做普通的项目上差别很大,对性能的要求非常的高,尤其大数据量和并发量的情况。目前在做门户的优化,在所有方式尝试之后不行,就得深入一行一行改代码,像楼主这样的代码,非常提倡,也感谢分享。实在看不出来跟装X有什么关系。难道非得出了性能问题再去擦屁股?

ps:经过对源代码的优化,性能提高了15%
93 楼 Jacky-Q 2010-06-09  
客户要求10秒做完的业务,满足需求即可。优化到5秒,谁给我钱啊?
92 楼 soongbo 2010-06-08  
lz总结的很不错啊,小case下我们可以理解出开发者的设计思路,重要的不就是学习高人的开发思路嘛,顶!
91 楼 swanky_yao 2010-06-08  
fireboyz2010 写道
其实这么多人急,只怪LZ起了个好标题!

你就是冲着这个标题进来的?^_^ 那有没有被忽悠的感觉?那我只能说对不起了,其实我也就是本着分享的精神而已,没有别的意图,I promise!
90 楼 jihui1988 2010-06-07  
iaimstar 写道
diferent 写道

做国内项目的吧 没有人在乎你的性能
但是还是有许多场合要求的 十分严格
我觉得 楼主找到的例子的价值 远比JE上讨论Linux与Windows Firefox与IE C与Java这种问题有意义的多.
"每句代码都想写的句句珠玑,既不可能,也不现实。"
要知道作家写出的每句话都是细细斟酌而出的
只有网上写连载小说的 才不会珍惜自己写出的文字


您可真会开玩笑,要求严格,不代表开发人员的素质就高,对日项目要求最严格,连sql,java最基本的代码该怎么写都规定好了,代码风格有统一又漂亮,可还是和大家一样,都是码农。看不出来国外项目能比国内项目在性能上真能高出多少,也就是整体质量在严格要求下显得好看一点而已。

“每句话都是细细斟酌而出”
明显你没有写过什么文章,写文章好的人不外乎两种,一种才华横溢、或是积累深厚,文章一蹴而就,然后接下来推敲,揣摩,修改。

向你说的那种半小时憋出一个字的写法,作家早就都饿死了。战争与和平/似水年华等等等等 都tm和字典那么大小,“每句话都是细细斟酌而出”,估计托尔斯泰之流老死都见不到出版


我中立的说:貌似人家没说写文章必须是过程中字字斟酌吧? 也许是我理解能力低下 不好意思啊
89 楼 jihui1988 2010-06-07  
freish 写道
正常人不都这么做吗?!

哎~~ 初级小菜菜 看来不是正常人了  初级小菜菜还没接触 
同时 多谢楼主的分享 我懂得了一点点
88 楼 fireboyz2010 2010-06-04  
其实这么多人急,只怪LZ起了个好标题!
87 楼 stoneskin 2010-06-04  
没想到见到这么多如此注重性能的人。
估计与大家在学校里老师讲解的侧重有关,对很多c时代程序员来说性能就是一切。

我学到到的是代码的可读性优于性能。
原因有
1.性能再好但容易出错的程序是失败的
2.升级硬件比程序员时间便宜。

还有一般对性能有要求的代码是让有经验的程序员写的,
在团队里,一般是不允许到处优化程序性能的。

看楼主里帖里的方法,主要是学到一个局部优化思路。
在不影响可读性的情况下,类似的优化是很有价值的。
86 楼 captmjc 2010-06-02  
swanky_yao 写道
captmjc 写道
另外,为什么没有304?

我只是截取了部分,没有全部贴上来


我说的是switch里面,如果涉及到静态内容,response中304可能比200,404都多
85 楼 mathfox 2010-06-02  
Xorcerer 写道
mathfox 写道
又一个可以在工作中装x的方法出现了。


前几天跟一个PHP的朋友说,函数调用是有开销的,然后介绍C++ inline 函数的概念。

然后过两天,他在公司,就用这个概念去为自己某一段复制了N次的代码辩护。晕。



你应该把inline和代码重构两本书一起给他看。
84 楼 swanky_yao 2010-06-02  
captmjc 写道
另外,为什么没有304?

我只是截取了部分,没有全部贴上来
83 楼 captmjc 2010-06-02  
另外,为什么没有304?
82 楼 岚岚宝贝 2010-06-02  
分析得很好,以后多思考 争取养成好的习惯
81 楼 chris_zley 2010-06-02  
原来有这种技巧。。楼主多介绍点吧,还真不知道
80 楼 swanky_yao 2010-06-02  
Xorcerer 写道
mathfox 写道
又一个可以在工作中装x的方法出现了。


前几天跟一个PHP的朋友说,函数调用是有开销的,然后介绍C++ inline 函数的概念。

然后过两天,他在公司,就用这个概念去为自己某一段复制了N次的代码辩护。晕。

可以写进你的糗事百科了 ^_^ 拿你说事儿
79 楼 swanky_yao 2010-06-02  
arthas777 写道
zhaona1986 写道
你们这帮老爷们,TMD还是男人吗!!!
为这个问题,你骂我,我骂你的!
搞到最后还搞出了火药味了!!!
      你们TMD每个人从事的领域可能都不同,当然会对这个问题会有不同的观念!这从你们TMD刚开始工作所踏入的领域一直到现在所决定的!
      扯着嗓子在这喊,叫有意思吗?
      有的领域要快速开发,要效率,有的领域,要仔细,要节省每一点资源!
      为什么吵来吵去都不知道这个根本的问题!!!
      TMD你让嵌入式的去写J2EE????
      TMD你让J2EE去写J2ME????
      可能吗?这三种人对楼主的看法,肯定都会不同的!!!
    
还有,楼主,你看着这些同行们,你我他都TMD的可怜的程序员为这个问题自相互骂,有意思,很得意?

      
     技术和积累就是在摩擦和火花中不断进步和加强的!
     是你太激动太嫩了!
     能有这样的平台,相离那么远的我们一起摩擦,甚是奢望!
     慢慢你就习惯了!

很同意你的观点 不要太愤青 凡是淡定 程序员都要心平气和才行 有激情是可以的 但不要动不动就TMD ^_^ 这里允许摩擦,有火药味也是可以的
78 楼 captmjc 2010-06-02  
不错的技巧。不过,如果这里特别需要速度的话,在switch之后,不用hashmap,而是直接用一个String[500]如何?

return sc[status - 100]; // 0xx不存在,100-5xx,500长度够用了,考虑速度,500长度的数组应该可以接受

sc[0] = "Continue" // 100
sc[1] = "Switching Protocols" // 101
sc[100] = "OK" // 200
77 楼 Xorcerer 2010-06-02  
mathfox 写道
又一个可以在工作中装x的方法出现了。


前几天跟一个PHP的朋友说,函数调用是有开销的,然后介绍C++ inline 函数的概念。

然后过两天,他在公司,就用这个概念去为自己某一段复制了N次的代码辩护。晕。

相关推荐

    前端开源库-just-kebab-case

    // 输出:'camel-case-key' ``` 此外,"just-kebab-case"库可能还提供了其他高级功能,如批量转换数组中的字符串,或者与其他命名规则(如snake_case或PascalCase)相互转换。这使得它在处理多样化的数据源时非常...

    前端开源库-to-constant-case

    为了方便开发者快速地将字符串转换为常量大小写格式(即所有单词首字母大写,其余字母小写),有一个名为`to-constant-case`的前端开源库应运而生。这个库的主要功能就是将输入的任意字符串转换为常量风格的表示,...

    Excel-VBA宏编程实例源代码-以Select Case使用Like运算.zip

    本压缩包“Excel-VBA宏编程实例源代码-以Select Case使用Like运算.zip”包含了一个名为“以Select Case使用Like运算.xlsm”的文件,它是一个VBA宏启用的工作簿,展示了如何在Select Case语句中使用Like运算符进行...

    前端开源库-to-title-case

    使用 "to-title-case" 库可以显著简化代码,避免手动处理字符串大小写的繁琐工作。例如,以下是如何在项目中引入和使用这个库的示例: ```javascript // 假设已通过npm安装了to-title-case库 const toTitleCase = ...

    verilog源代码-FPGA-XILINX

    - 结构化语句:包括always块(用于组合逻辑和时序逻辑描述)、if-else、case等控制结构。 - 模块化设计:通过模块定义,可以将复杂设计分解为可重用的单元,提高代码复用性和可维护性。 - 并行执行:Verilog代码...

    Java高手-代码篇.pdf

    根据提供的信息来看,这份文档似乎包含了大量乱码和非可读字符,这可能是编码问题或者文档损坏导致的结果。不过,我们可以尝试从标题、描述以及标签中提取一些有用的信息,并围绕这些信息来构建相关的Java编程知识点...

    ISO 683-3-2022- Part 3_ Case-hardening steels.pdf

    ISO 683-3-2022 Heat-treatable steels, alloy steels and free-cutting steels - Part 3_ Case-hardening steels.pdf

    跟我学vb--第10课时-select-case语句.doc

    【VB中的Select Case语句详解】 在VB编程中,Select Case语句是一种多分支选择结构,用于根据一个表达式的值来执行相应的代码块。...在编程实践中,合理利用Select Case语句可以极大地提升开发效率。

    worst-case.rar_RAB_Worst-case_worst case_波束 稳健_稳健波束形成

    在IT行业中,尤其是在无线通信和信号处理领域,"worst-case.rar_RAB_Worst-case_worst case_波束 稳健_稳健波束形成"这个标题和描述涉及到的关键技术是"稳健波束形成"(Robust Beamforming)。这是一种优化无线通信...

    前端开源库-just-kebab-case.zip

    // 输出 "my-camel-case-string" ``` 以上就是关于`just-kebab-case`这个前端开源库的一些基本介绍和可能的功能。这个库的具体实现和API可能会根据作者的设计有所不同,但其核心目的都是为了帮助开发者更高效地...

    最新完整版标准 ISO 683-3-2022 - Part 3_ Case-hardening steels.pdf

    最新完整版标准 ISO 683-3-2022 Heat-treatable steels, alloy steels and free-cutting steels - Part 3_ Case-hardening steels.pdf

    前端开源库-title-case-minors

    "前端开源库-title-case-minors"这个项目,正如其名,专注于处理标题大小写的问题,特别是针对那些在标题字符串中不应大写的未成年人单词(即不重要的或非专有名词的词汇)。 标题大小写是一种常见的文本格式规范,...

    前端开源库-to-sentence-case

    在实际项目中,"to-sentence-case"可能通过npm(Node.js的包管理器)进行安装,然后在JavaScript代码中导入并调用其提供的函数。例如: ```javascript const toSentenceCase = require('to-sentence-case'); let ...

    Atom-atom-change-case,节点的Atom插件.zip

    Node.js的change-case库提供了一系列方法,包括将字符串转为全大写、全小写、首字母大写等,这个插件将这些功能无缝集成到了Atom中,极大地提高了代码操作的效率。 安装"Atom-atom-change-case"插件非常简单,只需...

    Cisco - Ccie Fundamental - Network Design And Case Studies.PDF

    Cisco - Ccie Fundamental - Network Design And Case Studies.PDF

    前端开源库-to-snake-case

    在 "to-snake-case-master" 压缩包中,通常会包含以下内容: 1. **源代码文件**:例如 `index.js`,这是实现字符串转换功能的主要代码。 2. **测试文件**:可能有一个 `test` 目录,包含了单元测试,用于验证库的...

    前端开源库-to-capital-case

    `to-capital-case-master` 这个压缩包文件名可能是库的源码主分支,包含所有源代码、测试文件、文档和可能的配置文件。在使用前,你需要将其解压并根据项目需求进行安装和配置。如果库提供了README文件,里面通常会...

    eBay, Inc. and Amazon.com (A).pdf -- Harvard Business School case

    eBay, Inc. and Amazon.com (A).pdf -- Harvard Business School case

    金鹰asp超速入门视频教程-026.Select Case语句.rar

    【ASP基础与Select Case语句】 ASP(Active Server Pages)是一种微软公司开发的服务器端脚本环境,用于创建...通过实践和不断的练习,你会更加熟练地运用ASP中的Select Case语句,为你的网站开发工作带来极大的便利。

Global site tag (gtag.js) - Google Analytics