- 浏览: 31718 次
- 性别:
- 来自: 北京
最新评论
-
swanky_yao:
别人的帖子 我的一点感受
答复: 今天下午接到阿里的电话面试 -
windgoogle:
是你亲自面试的,还是转帖?
答复: 今天下午接到阿里的电话面试 -
likeykey:
有配置好的例子么 给我发一个呗 我配置怎么有问题 25213 ...
Struts2 Rest方式和非Rest方式共存 -
swanky_yao:
那个抓包工具叫什么我忘了 最主流的那个... 还导致我电脑蓝屏 ...
可以使staf速度更快的设置(win平台) -
parisian:
楼主有个问题,“通过对包的获取” 你是怎么抓包看到是ne ...
可以使staf速度更快的设置(win平台)
今天看sun的HttpMessages.java文件,虽然文件很小,但是对我的启发很大。
前面定义了大量的HTTP常量:
也可以趁机从这里查看HTTP返回值的意义^_^。然后定义了一个java.util.concurrent.ConcurrentHashMap的变量httpStatusCodeMappings,再往里面添加刚才定义的常量(这个操作放在了一个静态块里),如:
最重要的就是这个方法了,先看代码:
这段代码的用途很简单,就是要返回状态码对应的Message,而这些这些消息都已经存放在httpStatusCodeMappings变量里了,为了提高访问常用的几个返回码的Message,它直接用了一个静态块,而不去lookup那个map了,这就是高手!
错误就不说了,你这样测试时没有意义的
天地良心.
把代码写好懂点才更对的点别人
少作孽写一堆别人看不懂的代码
哥们,虽然你有5颗星,但这次不得不反对你了。个人觉得:这是一个非常不错的Tips,不至于看不懂吧?我写的话肯定会在switch语句块前注明为什么要这样写。考虑另外一个问题:
new ArrayList()就是没有必要的,当然啦,也不会太影响性能的,也不会产生可读性的问题,但是这样写真的应该吗?作为程序员,本身就应该精益求精,如果实际中我写了我粘上的这种类似的代码,我感到羞愧,不为别的,因为我想做到更好。
在讨论可读性和性能的问题,你这个例子说明了什么,可读性差,性能差,什么都不能说明
lz的代码可读性还可以,一般都会真么做的。
我一直认为可读性大于性能,当然这有个范围。
典型的没有写过高并发程序的思维方式,明明可以节约的地方,仅仅几行代码就可以优化,偏偏不做。
hashmap再快,也比case 一个 整型满上1w倍。
性能,是一点一点挤牙膏挤出来的,哪能到处浪费啊。
首先,谁说hash表比case慢一万倍的??
其实case的代码实现是 if ..else if形式的,复杂度是O(n)
hashMap 的复杂度是 O(1),当然里面的实现有函数调用,(函数调用的效率我没测试过,不过据《代码大全2》里面的资料,java的函数调用所消耗的时间和 普通赋值语句相同。) 就是说hashMap实际操作时间不过 十几个 语句周期。
代码最大的问题是 明明是一堆静态常量,为什么要用 ConcurrentHashMap??
感觉实际编码的过程是: 开始不知道为什么使用了一个大而全,含义复杂的map,(所以做成同步,key中出现了字符串拼装),后来发现效率不够,于是打补丁,就出现了那堆case。 没什么好说的,不过是一堆临时代码,真正应该做的是重构应该重新定义Map的结构。
其实这种东西效率最高的是 以空间换时间:
String[] httpStatusCode = new int[600];
httpStatusCode[404] = "Not Found";
………………
只是多使用了 600 * 8 = 4.8k空间。
或者最普通的方式,使用:
com.google.common.collect.ImmutableMap
方法是好方法,但case的代码实现是 if ..else 是错误的,深入理解计算机系统里面有明确解释,case背后的代码和ifelse比是数量级的差别尤其在case部分的数值是连续的情况下,和hashmap的差距应该至少可以达到两个数量级
正好最近讨论一个帖子,map的存取已经成为瓶颈
楼上你是代码有问题,实际结果:
switch:4334
map:117842
这个差距实际被return string带来的开销抹平不少,
这个开销是:
switch:1399
map:108843
遇到桶内元素大于1,应该还能拉个把数量级
第二个for循环怎么还getSwitchMessage(status);??应该是
getMapMessage(int status)了吧
少装X 装X遭雷劈
装X从来不会被雷劈,不然我的周围早已电闪雷鸣
典型的没有写过高并发程序的思维方式,明明可以节约的地方,仅仅几行代码就可以优化,偏偏不做。
hashmap再快,也比case 一个 整型满上1w倍。
性能,是一点一点挤牙膏挤出来的,哪能到处浪费啊。
首先,谁说hash表比case慢一万倍的??
其实case的代码实现是 if ..else if形式的,复杂度是O(n)
hashMap 的复杂度是 O(1),当然里面的实现有函数调用,(函数调用的效率我没测试过,不过据《代码大全2》里面的资料,java的函数调用所消耗的时间和 普通赋值语句相同。) 就是说hashMap实际操作时间不过 十几个 语句周期。
代码最大的问题是 明明是一堆静态常量,为什么要用 ConcurrentHashMap??
感觉实际编码的过程是: 开始不知道为什么使用了一个大而全,含义复杂的map,(所以做成同步,key中出现了字符串拼装),后来发现效率不够,于是打补丁,就出现了那堆case。 没什么好说的,不过是一堆临时代码,真正应该做的是重构应该重新定义Map的结构。
其实这种东西效率最高的是 以空间换时间:
String[] httpStatusCode = new int[600];
httpStatusCode[404] = "Not Found";
………………
只是多使用了 600 * 8 = 4.8k空间。
或者最普通的方式,使用:
com.google.common.collect.ImmutableMap
这个想法比较巧妙
天地良心.
把代码写好懂点才更对的点别人
少作孽写一堆别人看不懂的代码
哥们,虽然你有5颗星,但这次不得不反对你了。个人觉得:这是一个非常不错的Tips,不至于看不懂吧?我写的话肯定会在switch语句块前注明为什么要这样写。考虑另外一个问题:
new ArrayList()就是没有必要的,当然啦,也不会太影响性能的,也不会产生可读性的问题,但是这样写真的应该吗?作为程序员,本身就应该精益求精,如果实际中我写了我粘上的这种类似的代码,我感到羞愧,不为别的,因为我想做到更好。
天地良心.
把代码写好懂点才更对的点别人
少作孽写一堆别人看不懂的代码
你从哪里看出我没看过
人要学会自己思考,不要拿来就套
典型的没有写过高并发程序的思维方式,明明可以节约的地方,仅仅几行代码就可以优化,偏偏不做。
hashmap再快,也比case 一个 整型满上1w倍。
性能,是一点一点挤牙膏挤出来的,哪能到处浪费啊。
一个团队好多个人
指望所有人都挤牙膏,开玩笑
顶多就是核心代码慎重一些
整个项目再整体测试一下性能瓶颈,有针对性的调整就好了
每句代码都想写的句句珠玑,既不可能,也不现实。
在需求允许的范围内,尽量的提高开发效率,才能适时的交出合适的作业
建议去看看程序员修炼之道~~
前面定义了大量的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了,这就是高手!
评论
116 楼
kulinglei
2011-03-22
lubezhang 写道
看到这个帖子,自己也写了一个测试例子,但是结果好像不一样,是不是我的例子写的有问题吗?
import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class TestGetMessage { 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"; static Map<String, String> httpStatusCodeMappings = new ConcurrentHashMap<String, String>(); static { httpStatusCodeMappings.put("sc.305", STATUS_305); httpStatusCodeMappings.put("sc.307", STATUS_307); httpStatusCodeMappings.put("sc.400", STATUS_400); httpStatusCodeMappings.put("sc.401", STATUS_401); httpStatusCodeMappings.put("sc.402", STATUS_402); httpStatusCodeMappings.put("sc.403", STATUS_403); httpStatusCodeMappings.put("sc.404", STATUS_404); httpStatusCodeMappings.put("sc.405", STATUS_405); httpStatusCodeMappings.put("sc.406", STATUS_406); httpStatusCodeMappings.put("sc.407", STATUS_407); httpStatusCodeMappings.put("sc.408", STATUS_408); } public static String getSwitchMessage(int status){ switch (status) { case 305: return STATUS_305; case 404: return STATUS_404; } return null; } public static String getMapMessage(int status){ return httpStatusCodeMappings.get("sc."+ status); } public static void main(String[] args) { int status = 404; long loopNum = 100000000L; long switchStartTime = System.currentTimeMillis(); for(long i = 0; i < loopNum; i++){ getSwitchMessage(status); } System.out.println("switch:"+(System.currentTimeMillis() - switchStartTime)); long mapStartTime = System.currentTimeMillis(); for(long i = 0; i < loopNum; i++){ getSwitchMessage(status); } System.out.println("map:"+(System.currentTimeMillis() - mapStartTime)); } }
错误就不说了,你这样测试时没有意义的
115 楼
kulinglei
2011-03-22
myumen 写道
抛出异常的爱 写道
pengzhoushuo 写道
好贴,程序员都应该学习。
1、认为HashMap性能比switch高的同学建议学习下数据结构,所谓HashMap就是一个链表散列,一个连续的链表用于保存key,默认的情况下它的长度是16。HashMap对Key做Hash,根据取到的Hash码再找到对应的的key所在的散,再通过查找所在散列里对应Key从而找到Value。这种速度比得上4个case的switch?
2、以可读性作为借口的童鞋们的理由是站不住脚的,加了一个switch就看不懂了?即使是,过错也不在写程序的人,而是读程序的人,注释是写得清清楚楚......
3、说写好代码不如加硬件的童鞋,你觉得自己比不上机器?加硬件那是无耐之举。比如你做了一个OA管理系统,你跟领导说你需要10台高性能的机器才能跑起来,领导会怎么看你?可别跟我说什么云计算。最后套用达文西的话,做人要有良知才行啊,写程序也一样,要对得起自己良心。
1、认为HashMap性能比switch高的同学建议学习下数据结构,所谓HashMap就是一个链表散列,一个连续的链表用于保存key,默认的情况下它的长度是16。HashMap对Key做Hash,根据取到的Hash码再找到对应的的key所在的散,再通过查找所在散列里对应Key从而找到Value。这种速度比得上4个case的switch?
2、以可读性作为借口的童鞋们的理由是站不住脚的,加了一个switch就看不懂了?即使是,过错也不在写程序的人,而是读程序的人,注释是写得清清楚楚......
3、说写好代码不如加硬件的童鞋,你觉得自己比不上机器?加硬件那是无耐之举。比如你做了一个OA管理系统,你跟领导说你需要10台高性能的机器才能跑起来,领导会怎么看你?可别跟我说什么云计算。最后套用达文西的话,做人要有良知才行啊,写程序也一样,要对得起自己良心。
天地良心.
把代码写好懂点才更对的点别人
少作孽写一堆别人看不懂的代码
哥们,虽然你有5颗星,但这次不得不反对你了。个人觉得:这是一个非常不错的Tips,不至于看不懂吧?我写的话肯定会在switch语句块前注明为什么要这样写。考虑另外一个问题:
List someList = new ArrayList(); try { someList = someObject.somdMethod(); // more } catch (Exception e) { // do sth } return someList;
new ArrayList()就是没有必要的,当然啦,也不会太影响性能的,也不会产生可读性的问题,但是这样写真的应该吗?作为程序员,本身就应该精益求精,如果实际中我写了我粘上的这种类似的代码,我感到羞愧,不为别的,因为我想做到更好。
在讨论可读性和性能的问题,你这个例子说明了什么,可读性差,性能差,什么都不能说明
lz的代码可读性还可以,一般都会真么做的。
我一直认为可读性大于性能,当然这有个范围。
114 楼
ppgunjack
2011-03-22
徐风子 写道
skydream 写道
sw1982 写道
...lookup 一下hashmap真的那么低效吗? 建议复习下数据结构哦,你这些总结是没错,可是很表面
典型的没有写过高并发程序的思维方式,明明可以节约的地方,仅仅几行代码就可以优化,偏偏不做。
hashmap再快,也比case 一个 整型满上1w倍。
性能,是一点一点挤牙膏挤出来的,哪能到处浪费啊。
首先,谁说hash表比case慢一万倍的??
其实case的代码实现是 if ..else if形式的,复杂度是O(n)
hashMap 的复杂度是 O(1),当然里面的实现有函数调用,(函数调用的效率我没测试过,不过据《代码大全2》里面的资料,java的函数调用所消耗的时间和 普通赋值语句相同。) 就是说hashMap实际操作时间不过 十几个 语句周期。
代码最大的问题是 明明是一堆静态常量,为什么要用 ConcurrentHashMap??
感觉实际编码的过程是: 开始不知道为什么使用了一个大而全,含义复杂的map,(所以做成同步,key中出现了字符串拼装),后来发现效率不够,于是打补丁,就出现了那堆case。 没什么好说的,不过是一堆临时代码,真正应该做的是重构应该重新定义Map的结构。
其实这种东西效率最高的是 以空间换时间:
String[] httpStatusCode = new int[600];
httpStatusCode[404] = "Not Found";
………………
只是多使用了 600 * 8 = 4.8k空间。
或者最普通的方式,使用:
com.google.common.collect.ImmutableMap
方法是好方法,但case的代码实现是 if ..else 是错误的,深入理解计算机系统里面有明确解释,case背后的代码和ifelse比是数量级的差别尤其在case部分的数值是连续的情况下,和hashmap的差距应该至少可以达到两个数量级
正好最近讨论一个帖子,map的存取已经成为瓶颈
楼上你是代码有问题,实际结果:
switch:4334
map:117842
这个差距实际被return string带来的开销抹平不少,
public static int getSwitchMessage(int status){ switch (status) { case 305: return 1; case 404: return 2; } return 0; } public static int getMapMessage(int status){ httpStatusCodeMappings.get("sc."+ status); return 0; }
这个开销是:
switch:1399
map:108843
遇到桶内元素大于1,应该还能拉个把数量级
113 楼
swanky_yao
2011-03-22
lubezhang 写道
看到这个帖子,自己也写了一个测试例子,但是结果好像不一样,是不是我的例子写的有问题吗?
import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class TestGetMessage { 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"; static Map<String, String> httpStatusCodeMappings = new ConcurrentHashMap<String, String>(); static { httpStatusCodeMappings.put("sc.305", STATUS_305); httpStatusCodeMappings.put("sc.307", STATUS_307); httpStatusCodeMappings.put("sc.400", STATUS_400); httpStatusCodeMappings.put("sc.401", STATUS_401); httpStatusCodeMappings.put("sc.402", STATUS_402); httpStatusCodeMappings.put("sc.403", STATUS_403); httpStatusCodeMappings.put("sc.404", STATUS_404); httpStatusCodeMappings.put("sc.405", STATUS_405); httpStatusCodeMappings.put("sc.406", STATUS_406); httpStatusCodeMappings.put("sc.407", STATUS_407); httpStatusCodeMappings.put("sc.408", STATUS_408); } public static String getSwitchMessage(int status){ switch (status) { case 305: return STATUS_305; case 404: return STATUS_404; } return null; } public static String getMapMessage(int status){ return httpStatusCodeMappings.get("sc."+ status); } public static void main(String[] args) { int status = 404; long loopNum = 100000000L; long switchStartTime = System.currentTimeMillis(); for(long i = 0; i < loopNum; i++){ getSwitchMessage(status); } System.out.println("switch:"+(System.currentTimeMillis() - switchStartTime)); long mapStartTime = System.currentTimeMillis(); for(long i = 0; i < loopNum; i++){ getSwitchMessage(status); } System.out.println("map:"+(System.currentTimeMillis() - mapStartTime)); } }
第二个for循环怎么还getSwitchMessage(status);??应该是
getMapMessage(int status)了吧
112 楼
lubezhang
2011-03-22
看到这个帖子,自己也写了一个测试例子,但是结果好像不一样,是不是我的例子写的有问题吗?
import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class TestGetMessage { 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"; static Map<String, String> httpStatusCodeMappings = new ConcurrentHashMap<String, String>(); static { httpStatusCodeMappings.put("sc.305", STATUS_305); httpStatusCodeMappings.put("sc.307", STATUS_307); httpStatusCodeMappings.put("sc.400", STATUS_400); httpStatusCodeMappings.put("sc.401", STATUS_401); httpStatusCodeMappings.put("sc.402", STATUS_402); httpStatusCodeMappings.put("sc.403", STATUS_403); httpStatusCodeMappings.put("sc.404", STATUS_404); httpStatusCodeMappings.put("sc.405", STATUS_405); httpStatusCodeMappings.put("sc.406", STATUS_406); httpStatusCodeMappings.put("sc.407", STATUS_407); httpStatusCodeMappings.put("sc.408", STATUS_408); } public static String getSwitchMessage(int status){ switch (status) { case 305: return STATUS_305; case 404: return STATUS_404; } return null; } public static String getMapMessage(int status){ return httpStatusCodeMappings.get("sc."+ status); } public static void main(String[] args) { int status = 404; long loopNum = 100000000L; long switchStartTime = System.currentTimeMillis(); for(long i = 0; i < loopNum; i++){ getSwitchMessage(status); } System.out.println("switch:"+(System.currentTimeMillis() - switchStartTime)); long mapStartTime = System.currentTimeMillis(); for(long i = 0; i < loopNum; i++){ getSwitchMessage(status); } System.out.println("map:"+(System.currentTimeMillis() - mapStartTime)); } }
111 楼
killerover85
2011-02-28
看到你们的贴,偷乐
110 楼
joknm
2011-02-28
代码写得好还要领导看得懂。这就是悲哀。
109 楼
DAOException
2011-02-28
抢街饭 写道
我就感觉 sun的东西 一直被模仿 一直没有被超越
108 楼
抢街饭
2011-02-27
我就感觉 sun的东西 一直被模仿 一直没有被超越
107 楼
zhang_xzhi_xjtu
2011-02-27
性能提高了。
可读性并没有明显下降。
顶楼主的分享精神。
可读性并没有明显下降。
顶楼主的分享精神。
106 楼
ghostsun
2010-06-24
抛出异常的爱 写道
mathfox 写道
又一个可以在工作中装x的方法出现了。
少装X 装X遭雷劈
装X从来不会被雷劈,不然我的周围早已电闪雷鸣
105 楼
囧囧有神
2010-06-24
抛出异常的爱 写道
try { List someList = someObject.somdMethod(); // more return someList; } catch (Exception e) { // do sth }
try { List someList = someObject.somdMethod(); // more return someList; } catch (Exception e) { // do sth return new ArrayList(); }
104 楼
囧囧有神
2010-06-24
徐风子 写道
skydream 写道
sw1982 写道
...lookup 一下hashmap真的那么低效吗? 建议复习下数据结构哦,你这些总结是没错,可是很表面
典型的没有写过高并发程序的思维方式,明明可以节约的地方,仅仅几行代码就可以优化,偏偏不做。
hashmap再快,也比case 一个 整型满上1w倍。
性能,是一点一点挤牙膏挤出来的,哪能到处浪费啊。
首先,谁说hash表比case慢一万倍的??
其实case的代码实现是 if ..else if形式的,复杂度是O(n)
hashMap 的复杂度是 O(1),当然里面的实现有函数调用,(函数调用的效率我没测试过,不过据《代码大全2》里面的资料,java的函数调用所消耗的时间和 普通赋值语句相同。) 就是说hashMap实际操作时间不过 十几个 语句周期。
代码最大的问题是 明明是一堆静态常量,为什么要用 ConcurrentHashMap??
感觉实际编码的过程是: 开始不知道为什么使用了一个大而全,含义复杂的map,(所以做成同步,key中出现了字符串拼装),后来发现效率不够,于是打补丁,就出现了那堆case。 没什么好说的,不过是一堆临时代码,真正应该做的是重构应该重新定义Map的结构。
其实这种东西效率最高的是 以空间换时间:
String[] httpStatusCode = new int[600];
httpStatusCode[404] = "Not Found";
………………
只是多使用了 600 * 8 = 4.8k空间。
或者最普通的方式,使用:
com.google.common.collect.ImmutableMap
这个想法比较巧妙
103 楼
抛出异常的爱
2010-06-17
try { List someList = someObject.somdMethod(); // more return someList; } catch (Exception e) { // do sth }
102 楼
myumen
2010-06-13
抛出异常的爱 写道
pengzhoushuo 写道
好贴,程序员都应该学习。
1、认为HashMap性能比switch高的同学建议学习下数据结构,所谓HashMap就是一个链表散列,一个连续的链表用于保存key,默认的情况下它的长度是16。HashMap对Key做Hash,根据取到的Hash码再找到对应的的key所在的散,再通过查找所在散列里对应Key从而找到Value。这种速度比得上4个case的switch?
2、以可读性作为借口的童鞋们的理由是站不住脚的,加了一个switch就看不懂了?即使是,过错也不在写程序的人,而是读程序的人,注释是写得清清楚楚......
3、说写好代码不如加硬件的童鞋,你觉得自己比不上机器?加硬件那是无耐之举。比如你做了一个OA管理系统,你跟领导说你需要10台高性能的机器才能跑起来,领导会怎么看你?可别跟我说什么云计算。最后套用达文西的话,做人要有良知才行啊,写程序也一样,要对得起自己良心。
1、认为HashMap性能比switch高的同学建议学习下数据结构,所谓HashMap就是一个链表散列,一个连续的链表用于保存key,默认的情况下它的长度是16。HashMap对Key做Hash,根据取到的Hash码再找到对应的的key所在的散,再通过查找所在散列里对应Key从而找到Value。这种速度比得上4个case的switch?
2、以可读性作为借口的童鞋们的理由是站不住脚的,加了一个switch就看不懂了?即使是,过错也不在写程序的人,而是读程序的人,注释是写得清清楚楚......
3、说写好代码不如加硬件的童鞋,你觉得自己比不上机器?加硬件那是无耐之举。比如你做了一个OA管理系统,你跟领导说你需要10台高性能的机器才能跑起来,领导会怎么看你?可别跟我说什么云计算。最后套用达文西的话,做人要有良知才行啊,写程序也一样,要对得起自己良心。
天地良心.
把代码写好懂点才更对的点别人
少作孽写一堆别人看不懂的代码
哥们,虽然你有5颗星,但这次不得不反对你了。个人觉得:这是一个非常不错的Tips,不至于看不懂吧?我写的话肯定会在switch语句块前注明为什么要这样写。考虑另外一个问题:
List someList = new ArrayList(); try { someList = someObject.somdMethod(); // more } catch (Exception e) { // do sth } return someList;
new ArrayList()就是没有必要的,当然啦,也不会太影响性能的,也不会产生可读性的问题,但是这样写真的应该吗?作为程序员,本身就应该精益求精,如果实际中我写了我粘上的这种类似的代码,我感到羞愧,不为别的,因为我想做到更好。
101 楼
抛出异常的爱
2010-06-13
pengzhoushuo 写道
好贴,程序员都应该学习。
1、认为HashMap性能比switch高的同学建议学习下数据结构,所谓HashMap就是一个链表散列,一个连续的链表用于保存key,默认的情况下它的长度是16。HashMap对Key做Hash,根据取到的Hash码再找到对应的的key所在的散,再通过查找所在散列里对应Key从而找到Value。这种速度比得上4个case的switch?
2、以可读性作为借口的童鞋们的理由是站不住脚的,加了一个switch就看不懂了?即使是,过错也不在写程序的人,而是读程序的人,注释是写得清清楚楚......
3、说写好代码不如加硬件的童鞋,你觉得自己比不上机器?加硬件那是无耐之举。比如你做了一个OA管理系统,你跟领导说你需要10台高性能的机器才能跑起来,领导会怎么看你?可别跟我说什么云计算。最后套用达文西的话,做人要有良知才行啊,写程序也一样,要对得起自己良心。
1、认为HashMap性能比switch高的同学建议学习下数据结构,所谓HashMap就是一个链表散列,一个连续的链表用于保存key,默认的情况下它的长度是16。HashMap对Key做Hash,根据取到的Hash码再找到对应的的key所在的散,再通过查找所在散列里对应Key从而找到Value。这种速度比得上4个case的switch?
2、以可读性作为借口的童鞋们的理由是站不住脚的,加了一个switch就看不懂了?即使是,过错也不在写程序的人,而是读程序的人,注释是写得清清楚楚......
3、说写好代码不如加硬件的童鞋,你觉得自己比不上机器?加硬件那是无耐之举。比如你做了一个OA管理系统,你跟领导说你需要10台高性能的机器才能跑起来,领导会怎么看你?可别跟我说什么云计算。最后套用达文西的话,做人要有良知才行啊,写程序也一样,要对得起自己良心。
天地良心.
把代码写好懂点才更对的点别人
少作孽写一堆别人看不懂的代码
100 楼
pengzhoushuo
2010-06-13
好贴,程序员都应该学习。
1、认为HashMap性能比switch高的同学建议学习下数据结构,所谓HashMap就是一个链表散列,一个连续的链表用于保存key,默认的情况下它的长度是16。HashMap对Key做Hash,根据取到的Hash码再找到对应的的key所在的散,再通过查找所在散列里对应Key从而找到Value。这种速度比得上4个case的switch?
2、以可读性作为借口的童鞋们的理由是站不住脚的,加了一个switch就看不懂了?即使是,过错也不在写程序的人,而是读程序的人,注释是写得清清楚楚......
3、说写好代码不如加硬件的童鞋,你觉得自己比不上机器?加硬件那是无耐之举。比如你做了一个OA管理系统,你跟领导说你需要10台高性能的机器才能跑起来,领导会怎么看你?可别跟我说什么云计算。最后套用达文西的话,做人要有良知才行啊,写程序也一样,要对得起自己良心。
1、认为HashMap性能比switch高的同学建议学习下数据结构,所谓HashMap就是一个链表散列,一个连续的链表用于保存key,默认的情况下它的长度是16。HashMap对Key做Hash,根据取到的Hash码再找到对应的的key所在的散,再通过查找所在散列里对应Key从而找到Value。这种速度比得上4个case的switch?
2、以可读性作为借口的童鞋们的理由是站不住脚的,加了一个switch就看不懂了?即使是,过错也不在写程序的人,而是读程序的人,注释是写得清清楚楚......
3、说写好代码不如加硬件的童鞋,你觉得自己比不上机器?加硬件那是无耐之举。比如你做了一个OA管理系统,你跟领导说你需要10台高性能的机器才能跑起来,领导会怎么看你?可别跟我说什么云计算。最后套用达文西的话,做人要有良知才行啊,写程序也一样,要对得起自己良心。
99 楼
对酒当歌,人生几何
2010-06-12
领导 不需要性能。所以他们都反对。
98 楼
iaimstar
2010-06-09
hu437 写道
[
建议去看看程序员修炼之道~~
建议去看看程序员修炼之道~~
你从哪里看出我没看过
人要学会自己思考,不要拿来就套
97 楼
hu437
2010-06-09
iaimstar 写道
skydream 写道
sw1982 写道
...lookup 一下hashmap真的那么低效吗? 建议复习下数据结构哦,你这些总结是没错,可是很表面
典型的没有写过高并发程序的思维方式,明明可以节约的地方,仅仅几行代码就可以优化,偏偏不做。
hashmap再快,也比case 一个 整型满上1w倍。
性能,是一点一点挤牙膏挤出来的,哪能到处浪费啊。
一个团队好多个人
指望所有人都挤牙膏,开玩笑
顶多就是核心代码慎重一些
整个项目再整体测试一下性能瓶颈,有针对性的调整就好了
每句代码都想写的句句珠玑,既不可能,也不现实。
在需求允许的范围内,尽量的提高开发效率,才能适时的交出合适的作业
建议去看看程序员修炼之道~~
相关推荐
// 输出:'camel-case-key' ``` 此外,"just-kebab-case"库可能还提供了其他高级功能,如批量转换数组中的字符串,或者与其他命名规则(如snake_case或PascalCase)相互转换。这使得它在处理多样化的数据源时非常...
为了方便开发者快速地将字符串转换为常量大小写格式(即所有单词首字母大写,其余字母小写),有一个名为`to-constant-case`的前端开源库应运而生。这个库的主要功能就是将输入的任意字符串转换为常量风格的表示,...
本压缩包“Excel-VBA宏编程实例源代码-以Select Case使用Like运算.zip”包含了一个名为“以Select Case使用Like运算.xlsm”的文件,它是一个VBA宏启用的工作簿,展示了如何在Select Case语句中使用Like运算符进行...
使用 "to-title-case" 库可以显著简化代码,避免手动处理字符串大小写的繁琐工作。例如,以下是如何在项目中引入和使用这个库的示例: ```javascript // 假设已通过npm安装了to-title-case库 const toTitleCase = ...
- 结构化语句:包括always块(用于组合逻辑和时序逻辑描述)、if-else、case等控制结构。 - 模块化设计:通过模块定义,可以将复杂设计分解为可重用的单元,提高代码复用性和可维护性。 - 并行执行:Verilog代码...
根据提供的信息来看,这份文档似乎包含了大量乱码和非可读字符,这可能是编码问题或者文档损坏导致的结果。不过,我们可以尝试从标题、描述以及标签中提取一些有用的信息,并围绕这些信息来构建相关的Java编程知识点...
ISO 683-3-2022 Heat-treatable steels, alloy steels and free-cutting steels - Part 3_ Case-hardening steels.pdf
【VB中的Select Case语句详解】 在VB编程中,Select Case语句是一种多分支选择结构,用于根据一个表达式的值来执行相应的代码块。...在编程实践中,合理利用Select Case语句可以极大地提升开发效率。
在IT行业中,尤其是在无线通信和信号处理领域,"worst-case.rar_RAB_Worst-case_worst case_波束 稳健_稳健波束形成"这个标题和描述涉及到的关键技术是"稳健波束形成"(Robust Beamforming)。这是一种优化无线通信...
// 输出 "my-camel-case-string" ``` 以上就是关于`just-kebab-case`这个前端开源库的一些基本介绍和可能的功能。这个库的具体实现和API可能会根据作者的设计有所不同,但其核心目的都是为了帮助开发者更高效地...
最新完整版标准 ISO 683-3-2022 Heat-treatable steels, alloy steels and free-cutting steels - Part 3_ Case-hardening steels.pdf
"前端开源库-title-case-minors"这个项目,正如其名,专注于处理标题大小写的问题,特别是针对那些在标题字符串中不应大写的未成年人单词(即不重要的或非专有名词的词汇)。 标题大小写是一种常见的文本格式规范,...
在实际项目中,"to-sentence-case"可能通过npm(Node.js的包管理器)进行安装,然后在JavaScript代码中导入并调用其提供的函数。例如: ```javascript const toSentenceCase = require('to-sentence-case'); let ...
Node.js的change-case库提供了一系列方法,包括将字符串转为全大写、全小写、首字母大写等,这个插件将这些功能无缝集成到了Atom中,极大地提高了代码操作的效率。 安装"Atom-atom-change-case"插件非常简单,只需...
Cisco - Ccie Fundamental - Network Design And Case Studies.PDF
在 "to-snake-case-master" 压缩包中,通常会包含以下内容: 1. **源代码文件**:例如 `index.js`,这是实现字符串转换功能的主要代码。 2. **测试文件**:可能有一个 `test` 目录,包含了单元测试,用于验证库的...
`to-capital-case-master` 这个压缩包文件名可能是库的源码主分支,包含所有源代码、测试文件、文档和可能的配置文件。在使用前,你需要将其解压并根据项目需求进行安装和配置。如果库提供了README文件,里面通常会...
eBay, Inc. and Amazon.com (A).pdf -- Harvard Business School case
【ASP基础与Select Case语句】 ASP(Active Server Pages)是一种微软公司开发的服务器端脚本环境,用于创建...通过实践和不断的练习,你会更加熟练地运用ASP中的Select Case语句,为你的网站开发工作带来极大的便利。