该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-12-30
try { Integer.parseInt(str); } catch (Exception ex) { return false; } return true; } 怎么就那么多人想不开呢? 我就不明白了,用异常做判断怎么了? 这方法到底有什么问题呀? 看不懂?不可能呀。6行代码。 性能不好?我只能说,没看见的话,别瞎说。 和书里说的不一样? 书里就算列了180条异常怎么用的规则。在实践中就是有一种用法和书里不一样,那怎么办?这并不代表这种方法错了,你要看实践的效果,这才能衡量这个方法好不好.. 多动动脑,想想是不是书里的那些规则对于这个代码不起作用。 那到底什么原因,说这代码不能用呢??? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-12-30
最后修改:2010-12-30
gdpglc 写道 性能不好?我只能说,没看见的话,别瞎说。 我只好来瞎说一下了。主要还是性能问题,这个方法如果调用次数不多,怎么写都无所谓,如果次数多还是不要这样用的好。 public class Test { public static boolean validateInteger(String str) { try { Integer.parseInt(str); } catch (Exception ex) { return false; } return true; } public static boolean validateInteger2(String str) { char[] chars = str.toCharArray(); for (int i = 0; i < chars.length; i++) { if ((chars[i] > '9' || chars[i] < '0') && !(i == 0 && chars[0] == '-' && chars.length > 1)) { return false; } } return chars.length > 0; } private static final int TIME = 100000; private static final String STR_WRONG = "1234567890XX"; private static final String STR_RIGHT = "1234567890"; private static final boolean JIT = false; public static void main(String[] args) { if (JIT) { for (int i = 0; i < 1000000; i++) { validateInteger("0"); validateInteger2("0"); } System.out.println("进行JIT预热"); } else { System.out.println("不进行JIT预热"); } long l = System.nanoTime(); for (int i = 0; i < TIME; i++) { validateInteger(STR_RIGHT); } System.out.println("字符串为整数,验证方式1:" + (System.nanoTime() - l) + "ns"); l = System.nanoTime(); for (int i = 0; i < TIME; i++) { validateInteger2(STR_RIGHT); } System.out.println("字符串为整数,验证方式2:" + (System.nanoTime() - l) + "ns"); l = System.nanoTime(); for (int i = 0; i < TIME; i++) { validateInteger(STR_WRONG); } System.out.println("字符串为非整数,验证方式1:" + (System.nanoTime() - l) + "ns"); l = System.nanoTime(); for (int i = 0; i < TIME; i++) { validateInteger2(STR_WRONG); } System.out.println("字符串为非整数,验证方式2:" + (System.nanoTime() - l) + "ns"); } } 引用 进行JIT预热 字符串为整数,验证方式1:9535717ns 字符串为整数,验证方式2:8934368ns 字符串为非整数,验证方式1:2029725263ns 字符串为非整数,验证方式2:7702305ns 不进行JIT预热 字符串为整数,验证方式1:25392935ns 字符串为整数,验证方式2:15882435ns 字符串为非整数,验证方式1:2058369758ns 字符串为非整数,验证方式2:9489115ns 如果不出现异常,那性能其实差不了多远,尤其是JIT编译了之后。但出现了异常就有两百多倍的差距,还是很客观的。 |
|
返回顶楼 | |
发表时间:2010-12-30
弱弱的问一下:进行JIT预热是什么意思,为什么不进行JIT预热和进行JIT预热差别那么大呢?谢谢!
|
|
返回顶楼 | |
发表时间:2010-12-30
9个问号, 就是不想自己写个代码测试下。
你这是撒泼呢 |
|
返回顶楼 | |
发表时间:2010-12-30
最后修改:2010-12-30
IcyFenix 写道 gdpglc 写道 性能不好?我只能说,没看见的话,别瞎说。 我只好来瞎说一下了。主要还是性能问题,这个方法如果调用次数不多,怎么写都无所谓,如果次数多还是不要这样用的好。 public class Test { public static boolean validateInteger(String str) { try { Integer.parseInt(str); } catch (Exception ex) { return false; } return true; } public static boolean validateInteger2(String str) { char[] chars = str.toCharArray(); for (int i = 0; i < chars.length; i++) { if ((chars[i] > '9' || chars[i] < '0') && !(i == 0 && chars[0] == '-' && chars.length > 1)) { return false; } } return chars.length > 0; } private static final int TIME = 100000; private static final String STR_WRONG = "1234567890XX"; private static final String STR_RIGHT = "1234567890"; private static final boolean JIT = false; public static void main(String[] args) { if (JIT) { for (int i = 0; i < 1000000; i++) { validateInteger("0"); validateInteger2("0"); } System.out.println("进行JIT预热"); } else { System.out.println("不进行JIT预热"); } long l = System.nanoTime(); for (int i = 0; i < TIME; i++) { validateInteger(STR_RIGHT); } System.out.println("字符串为整数,验证方式1:" + (System.nanoTime() - l) + "ns"); l = System.nanoTime(); for (int i = 0; i < TIME; i++) { validateInteger2(STR_RIGHT); } System.out.println("字符串为整数,验证方式2:" + (System.nanoTime() - l) + "ns"); l = System.nanoTime(); for (int i = 0; i < TIME; i++) { validateInteger(STR_WRONG); } System.out.println("字符串为非整数,验证方式1:" + (System.nanoTime() - l) + "ns"); l = System.nanoTime(); for (int i = 0; i < TIME; i++) { validateInteger2(STR_WRONG); } System.out.println("字符串为非整数,验证方式2:" + (System.nanoTime() - l) + "ns"); } } 引用 进行JIT预热 字符串为整数,验证方式1:9535717ns 字符串为整数,验证方式2:8934368ns 字符串为非整数,验证方式1:2029725263ns 字符串为非整数,验证方式2:7702305ns 不进行JIT预热 字符串为整数,验证方式1:25392935ns 字符串为整数,验证方式2:15882435ns 字符串为非整数,验证方式1:2058369758ns 字符串为非整数,验证方式2:9489115ns 如果不出现异常,那性能其实差不了多远,尤其是JIT编译了之后。但出现了异常就有两百多倍的差距,还是很客观的。 我要是用 c 重写一下这个方法,我没试,我想还能差出200倍。那你是不是要用JNI来调用C写的方法呀? 你看见过软件出问题吗? 看见过软件真出现性能瓶颈时是什么样吗? 从你写的代码上看,你100%没看见过。所以还是瞎说。 你认为你的代码代来了高性能吗? 1000000次调用最多差出2秒。你知到如果软件在1000000次涉及到数据库的处理时会产生多少延迟吗?你的软件真有这么频繁的数据处理时,数据库早就先出现问题了。 我定义一下什么叫瞎说:就是没有在真正给用户使用的软件中,发现使用异常判断方式产生性能问题的都叫瞎说。 |
|
返回顶楼 | |
发表时间:2010-12-30
我的确遇到过几次性能问题。经验是,在内存里进行的操作,不用考虑它的执行速度,因为现在的cpu足够快,内存中的操作,是有差异,但对于应用来说几乎都是不能查觉的。那这种差异即可忽略。
|
|
返回顶楼 | |
发表时间:2010-12-30
如果 性能问题是用户感觉不到的,只有那些自认为了不起的高手能感觉到,我看这就是笑话。
|
|
返回顶楼 | |
发表时间:2010-12-30
象这种数据校验,通常都是用在用户输入的校验上。你认为,你费劲把力的给用户省了几个ns,用户会感谢你吗?
|
|
返回顶楼 | |
发表时间:2010-12-30
java做的事,就是尽量给程序员空间。在性能上给程序员很大的余量。正因为如此,现在的软件行业门坎才不高。
你以为我不知道抛异常会花时间吗?可是我更知道,对于这个问题,这点时间是可以忽略的。 按你的逻辑我看,hibernate估计也是不能用了,你再测测jdbc和hibernate差多少倍... |
|
返回顶楼 | |
发表时间:2010-12-31
我是最受不了拿性能说事的人。因为根本不懂,还以为自已明白...
|
|
返回顶楼 | |