<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>解惑 &#187; 方法</title>
	<atom:link href="http://www.jiehoo.me/tag/%e6%96%b9%e6%b3%95/feed" rel="self" type="application/rss+xml" />
	<link>http://www.jiehoo.me</link>
	<description>解己之惑，解人之惑</description>
	<lastBuildDate>Mon, 19 Jul 2010 10:01:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>得到当前方法</title>
		<link>http://www.jiehoo.me/%e5%be%97%e5%88%b0%e5%bd%93%e5%89%8d%e6%96%b9%e6%b3%95.htm</link>
		<comments>http://www.jiehoo.me/%e5%be%97%e5%88%b0%e5%bd%93%e5%89%8d%e6%96%b9%e6%b3%95.htm#comments</comments>
		<pubDate>Thu, 09 Aug 2007 13:53:46 +0000</pubDate>
		<dc:creator>Cherami</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[方法]]></category>

		<guid isPermaLink="false">http://www.jiehoo.com/%e5%be%97%e5%88%b0%e5%bd%93%e5%89%8d%e6%96%b9%e6%b3%95.htm</guid>
		<description><![CDATA[在写代码的时候我们可能会需要当前的方法名，特别是在输出一些调试信息的时候，但是如果使用字符串硬写的话不太好，API好像也不带对应的功能，如果细心的话，异常信息里面是带出错的方法名的，我们可以dump stack trace并分析得到当前方法的方法名，实际上有更好的方法，和dump stack trace类似： public static String getCurrentMethodName() { &#160;&#160;&#160; StackTraceElement element=Thread.currentThread().getStackTrace()[3]; &#160; &#160; return element.getClassName()+&#34;.&#34;+element.getMethodName(); } 为什么是3呢？从0到2分别是： java.lang.Thread.dumpThreads java.lang.Thread.getStackTrace xxx.Xxxx.getCurrentMethodName：也就是你定义这个工具方法的类]]></description>
			<content:encoded><![CDATA[<p class='fp'>在写代码的时候我们可能会需要当前的方法名，特别是在输出一些调试信息的时候，但是如果使用字符串硬写的话不太好，API好像也不带对应的功能，如果细心的话，异常信息里面是带出错的方法名的，我们可以dump stack trace并分析得到当前方法的方法名，实际上有更好的方法，和dump stack trace类似：<br />
public static String getCurrentMethodName() {<br />
&nbsp;&nbsp;&nbsp; StackTraceElement element=Thread.currentThread().getStackTrace()[3];<br />
&nbsp; &nbsp; return element.getClassName()+&quot;.&quot;+element.getMethodName(); <br />
}<br />
为什么是3呢？从0到2分别是：<br />
java.lang.Thread.dumpThreads<br />
java.lang.Thread.getStackTrace<br />
xxx.Xxxx.getCurrentMethodName：也就是你定义这个工具方法的类</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jiehoo.me/%e5%be%97%e5%88%b0%e5%bd%93%e5%89%8d%e6%96%b9%e6%b3%95.htm/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Google面试题解说性能之总结</title>
		<link>http://www.jiehoo.me/google%e9%9d%a2%e8%af%95%e9%a2%98%e8%a7%a3%e8%af%b4%e6%80%a7%e8%83%bd%e4%b9%8b%e6%80%bb%e7%bb%93.htm</link>
		<comments>http://www.jiehoo.me/google%e9%9d%a2%e8%af%95%e9%a2%98%e8%a7%a3%e8%af%b4%e6%80%a7%e8%83%bd%e4%b9%8b%e6%80%bb%e7%bb%93.htm#comments</comments>
		<pubDate>Fri, 06 Apr 2007 08:44:16 +0000</pubDate>
		<dc:creator>Cherami</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[优化]]></category>
		<category><![CDATA[方法]]></category>
		<category><![CDATA[性能]]></category>

		<guid isPermaLink="false">http://www.jiehoo.com/google%e9%9d%a2%e8%af%95%e9%a2%98%e8%a7%a3%e8%af%b4%e6%80%a7%e8%83%bd%e4%b9%8b%e6%80%bb%e7%bb%93.htm</guid>
		<description><![CDATA[呵呵，说了这么多，到底怎么优化性能还是没有说多少，而且一个产品的代码比这个例子复杂得多，怎么才能优化产品代码呢？ 很简单，找到性能瓶颈，而大部分的性能瓶颈都有一个特点：被执行的次数太多。一个耗时2分钟的操作，如果系统运行一天才需要运行一次，那么我们根本就不要去理会它，如果一个操作耗时2秒，但是一般运行一天它要被执行几千亿次，那么你就要小心了。 如何才能知道系统中的哪些代码被执行的次数最多呢？有很多工具可以，有的是挂到系统上一起运行，有的是可以单独运行，但是我推荐的方法就是使用单元测试工具和代码覆盖工具，运行所有的单元测试，查看代码覆盖报告中被执行的次数最多的那些语句，看看他们是否可以被优化，或者可以被减少执行的次数。 可以参考我以前的一些日志： Ant+JUnit+Cobertura 成功提高20倍性能 很多情况下，找到性能的瓶颈并不是很困难，真正困难的是如何进行优化。这个没有通用的解决方法，只能结合具体的问题具体解决，一个大部分情况下有效的方法是使用某种缓存机制（实际上，我的第二个例子也是使用了缓存机制，把运算结果缓存了9次）。 Google面试题解说性能之一：字符串运算VS数字运算 Google面试题解说性能之二：分析问题 Google面试题解说性能之三：不要小看循环中的任何一个语句 Google面试题解说性能之四：优化无止境 Google面试题解说性能之五：人比电脑聪明 Google面试题解说性能之六：数学显神威 Google面试题解说性能之七：缓存中间结果 Google面试题解说性能之八：工欲善其事必先利其器 Google面试题解说性能之总结]]></description>
			<content:encoded><![CDATA[<p class='fp'>呵呵，说了这么多，到底怎么优化性能还是没有说多少，而且一个产品的代码比这个例子复杂得多，怎么才能优化产品代码呢？<br />
很简单，找到性能瓶颈，而大部分的性能瓶颈都有一个特点：被执行的次数太多。一个耗时2分钟的操作，如果系统运行一天才需要运行一次，那么我们根本就不要去理会它，如果一个操作耗时2秒，但是一般运行一天它要被执行几千亿次，那么你就要小心了。<br />
如何才能知道系统中的哪些代码被执行的次数最多呢？有很多工具可以，有的是挂到系统上一起运行，有的是可以单独运行，但是我推荐的方法就是使用单元测试工具和代码覆盖工具，运行所有的单元测试，查看代码覆盖报告中被执行的次数最多的那些语句，看看他们是否可以被优化，或者可以被减少执行的次数。<br />
可以参考我以前的一些日志：<br />
<a href="http://www.jiehoo.com/ant-junit-cobertura.htm">Ant+JUnit+Cobertura</a> <br />
<a href="http://www.jiehoo.com/improve-performance-twenty-times.htm">成功提高20倍性能</a></p>
<p>很多情况下，找到性能的瓶颈并不是很困难，真正困难的是如何进行优化。这个没有通用的解决方法，只能结合具体的问题具体解决，一个大部分情况下有效的方法是使用某种缓存机制（实际上，我的第二个例子也是使用了缓存机制，把运算结果缓存了9次）。</p>
<ol>
<li>
<h3><a href="../../google%e9%9d%a2%e8%af%95%e9%a2%98%e8%a7%a3%e8%af%b4%e6%80%a7%e8%83%bd%e4%b9%8b%e4%b8%80%ef%bc%9a%e5%ad%97%e7%ac%a6%e4%b8%b2%e8%bf%90%e7%ae%97vs%e6%95%b0%e5%ad%97%e8%bf%90%e7%ae%97.htm" rel="bookmark" title="到 Google面试题解说性能之一：字符串运算VS数字运算 的永久链接">Google面试题解说性能之一：字符串运算VS数字运算</a></h3>
</li>
<li>
<h3><a href="../../google%e9%9d%a2%e8%af%95%e9%a2%98%e8%a7%a3%e8%af%b4%e6%80%a7%e8%83%bd%e4%b9%8b%e4%ba%8c%ef%bc%9a%e5%88%86%e6%9e%90%e9%97%ae%e9%a2%98.htm" rel="bookmark" title="到 Google面试题解说性能之二：分析问题 的永久链接">Google面试题解说性能之二：分析问题</a></h3>
</li>
<li>
<h3><a href="../../google-performance-3.htm" rel="bookmark" title="到 Google面试题解说性能之三：不要小看循环中的任何一个语句 的永久链接">Google面试题解说性能之三：不要小看循环中的任何一个语句</a></h3>
</li>
<li>
<h3><a href="../../google%e9%9d%a2%e8%af%95%e9%a2%98%e8%a7%a3%e8%af%b4%e6%80%a7%e8%83%bd%e4%b9%8b%e5%9b%9b%ef%bc%9a%e4%bc%98%e5%8c%96%e6%97%a0%e6%ad%a2%e5%a2%83.htm" rel="bookmark" title="到 Google面试题解说性能之四：优化无止境 的永久链接">Google面试题解说性能之四：优化无止境</a></h3>
</li>
<li>
<h3><a href="../../google%e9%9d%a2%e8%af%95%e9%a2%98%e8%a7%a3%e8%af%b4%e6%80%a7%e8%83%bd%e4%b9%8b%e4%ba%94%ef%bc%9a%e4%ba%ba%e6%af%94%e7%94%b5%e8%84%91%e8%81%aa%e6%98%8e.htm" rel="bookmark" title="到 Google面试题解说性能之五：人比电脑聪明 的永久链接">Google面试题解说性能之五：人比电脑聪明</a></h3>
</li>
<li>
<h3><a href="../../google%e9%9d%a2%e8%af%95%e9%a2%98%e8%a7%a3%e8%af%b4%e6%80%a7%e8%83%bd%e4%b9%8b%e5%85%ad%ef%bc%9a%e6%95%b0%e5%ad%a6%e6%98%be%e7%a5%9e%e5%a8%81.htm" rel="bookmark" title="到 Google面试题解说性能之六：数学显神威 的永久链接">Google面试题解说性能之六：数学显神威</a></h3>
</li>
<li>
<h3><a href="../../google%e9%9d%a2%e8%af%95%e9%a2%98%e8%a7%a3%e8%af%b4%e6%80%a7%e8%83%bd%e4%b9%8b%e4%b8%83%ef%bc%9a%e7%bc%93%e5%ad%98%e4%b8%ad%e9%97%b4%e7%bb%93%e6%9e%9c.htm" rel="bookmark" title="到 Google面试题解说性能之七：缓存中间结果 的永久链接">Google面试题解说性能之七：缓存中间结果</a></h3>
</li>
<li>
<h3><a href="../../google%e9%9d%a2%e8%af%95%e9%a2%98%e8%a7%a3%e8%af%b4%e6%80%a7%e8%83%bd%e4%b9%8b%e5%85%ab%ef%bc%9a%e5%b7%a5%e6%ac%b2%e5%96%84%e5%85%b6%e4%ba%8b%e5%bf%85%e5%85%88%e5%88%a9%e5%85%b6%e5%99%a8.htm" rel="bookmark" title="到 Google面试题解说性能之八：工欲善其事必先利其器 的永久链接">Google面试题解说性能之八：工欲善其事必先利其器</a></h3>
</li>
<li>
<h3><a href="../../google%e9%9d%a2%e8%af%95%e9%a2%98%e8%a7%a3%e8%af%b4%e6%80%a7%e8%83%bd%e4%b9%8b%e6%80%bb%e7%bb%93.htm" rel="bookmark" title="到 Google面试题解说性能之总结 的永久链接">Google面试题解说性能之总结</a></h3>
</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.jiehoo.me/google%e9%9d%a2%e8%af%95%e9%a2%98%e8%a7%a3%e8%af%b4%e6%80%a7%e8%83%bd%e4%b9%8b%e6%80%bb%e7%bb%93.htm/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>提高Java技能的几种简单有效的方法</title>
		<link>http://www.jiehoo.me/several-simple-way-to-improve-java-technology.htm</link>
		<comments>http://www.jiehoo.me/several-simple-way-to-improve-java-technology.htm#comments</comments>
		<pubDate>Sat, 06 Jan 2007 12:24:53 +0000</pubDate>
		<dc:creator>Cherami</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[技能]]></category>
		<category><![CDATA[提高]]></category>
		<category><![CDATA[方法]]></category>

		<guid isPermaLink="false">http://www.jiehoo.com/several-simple-way-to-improve-java-technology.htm</guid>
		<description><![CDATA[这个问题可能是很多做Java的人最关心的，特别是新手，而且我原来也写过一些东西，现在我再简单的列举一些简单但是行之有效的方法： 上各个技术论坛看别人的帖子，特别是那些回复数或者点击数比较高的帖子，回复数高说明讨论激烈，很可能有高手在当中切磋，点击数高说明这个是大家很关心的，你以后很可能也会遇到或者用得上。 尝试帮助别人解决问题，特别是你没有遇到过，但是你知道原因或者你懂得其中的原理，在这个过程中，你可以逐步的培养自己解决问题的能力、经验以及自信心。 多看别人写的代码，无论是高手还是新手，从高手的代码你可以学习东西，从新手的代码中，你可以尝试去修改他的代码，让这个代码更加的高效、通用、简单，总之就是尽可能优化，直到你自己感觉很满意。 注意积累自己的代码库，有时候是一个简单的方法，有时候可能是一个小的功能块，有时候甚至是一个比较大的子系统，以后自己要写一个系统，或者要设计一个系统，甚至你遇到设计问题的时候，你都可以到这些代码库中寻找思路甚至是直接拿来用。最重要的是，无论你认为自己的公司多么的差，多么的没有技术含量，你所在的项目肯定会有有价值的代码。（但是要注意，不要仅仅拷贝一份代码，要抽取你能够理解，并认为有价值的部分） 多看书，系统的看书，不要浅尝辄止，要看那些经典的书。程序设计风格、设计模式、OO、重构都是必看的。 最后也是最重要的是，遇到问题，要尽量去了解为什么会出现这样的问题，而不是仅仅停留在解决问题的层次。 如果你有信心并且确实可以在一个月之内找到一份满意的工作，你基本上可以算是高手（高手不一定高薪，但是温饱应该问题不大）了 最后是关于时间，众所周知，新手都会面临一个先有鸡还是先有蛋的问题，公司都要求你有经验，但是新手没有，所以你一定是一个蛋，你要把你的全部时间都花在提高自己上，少看些新闻，多看些书、看些帖子吧，当然，要花一些时间在锻炼身体上（呵呵，这个是我现在最大的感受）。关于加班，尽量避免，有两个方法，一个是提高自己的效率（使用合适的工具辅助，工欲善其事必先利其器），另外一个就是多思考你的那些工作是重复性的，怎么样可以少写一些代码。]]></description>
			<content:encoded><![CDATA[<p class='fp'>这个问题可能是很多做Java的人最关心的，特别是新手，而且<a href="http://www.jiehoo.com/improve-java-technology.htm">我原来也写过一些东西</a>，现在我再简单的列举一些简单但是行之有效的方法：</p>
<ul>
<li>上各个技术论坛看别人的帖子，特别是那些回复数或者点击数比较高的帖子，回复数高说明讨论激烈，很可能有高手在当中切磋，点击数高说明这个是大家很关心的，你以后很可能也会遇到或者用得上。</li>
<li>尝试帮助别人解决问题，特别是你没有遇到过，但是你知道原因或者你懂得其中的原理，在这个过程中，你可以逐步的培养自己解决问题的能力、经验以及自信心。</li>
<li>多看别人写的代码，无论是高手还是新手，从高手的代码你可以学习东西，从新手的代码中，你可以尝试去修改他的代码，让这个代码更加的高效、通用、简单，总之就是尽可能优化，直到你自己感觉很满意。</li>
<li>注意积累自己的代码库，有时候是一个简单的方法，有时候可能是一个小的功能块，有时候甚至是一个比较大的子系统，以后自己要写一个系统，或者要设计一个系统，甚至你遇到设计问题的时候，你都可以到这些代码库中寻找思路甚至是直接拿来用。最重要的是，无论你认为自己的公司多么的差，多么的没有技术含量，你所在的项目肯定会有有价值的代码。（但是要注意，不要仅仅拷贝一份代码，要抽取你能够理解，并认为有价值的部分）</li>
<li>多看书，系统的看书，不要浅尝辄止，要看那些经典的书。程序设计风格、设计模式、OO、重构都是必看的。</li>
<li>最后也是最重要的是，遇到问题，要尽量去了解为什么会出现这样的问题，而不是仅仅停留在解决问题的层次。</li>
</ul>
<p>如果你有信心并且确实可以在一个月之内找到一份满意的工作，你基本上可以算是高手（高手不一定高薪，但是温饱应该问题不大）了<img alt="" src="/FCKeditor/editor/images/smiley/msn/wink_smile.gif" /></p>
<p>最后是关于时间，众所周知，新手都会面临一个先有鸡还是先有蛋的问题，公司都要求你有经验，但是新手没有，所以你一定是一个蛋，你要把你的全部时间都花在提高自己上，少看些新闻，多看些书、看些帖子吧，当然，要花一些时间在锻炼身体上（呵呵，这个是我现在最大的感受）。关于加班，尽量避免，有两个方法，一个是提高自己的效率（使用合适的工具辅助，工欲善其事必先利其器），另外一个就是多思考你的那些工作是重复性的，怎么样可以少写一些代码。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jiehoo.me/several-simple-way-to-improve-java-technology.htm/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>条条大路通罗马</title>
		<link>http://www.jiehoo.me/all-roads-lead-to-rome.htm</link>
		<comments>http://www.jiehoo.me/all-roads-lead-to-rome.htm#comments</comments>
		<pubDate>Tue, 05 Dec 2006 11:47:51 +0000</pubDate>
		<dc:creator>Cherami</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[杂感]]></category>
		<category><![CDATA[缓存]]></category>
		<category><![CDATA[解决方案]]></category>
		<category><![CDATA[MockEJB]]></category>
		<category><![CDATA[方法]]></category>

		<guid isPermaLink="false">http://www.jiehoo.com/%e6%9d%a1%e6%9d%a1%e5%a4%a7%e8%b7%af%e9%80%9a%e7%bd%97%e9%a9%ac.htm</guid>
		<description><![CDATA[今天在写测试的用例的时候发现框架的一个Bug，CMP在初始化Entity Bean的时候会自动初始化相关的Entity Bean，但是如果是在一对多的情况下，首先使用的如果是一那端的情况下，不会自动的初始化多那一端的Entity Bean，后来添加了代码修正这个问题后，发现原来只要2分钟运行的所有的测试用例要15分钟才能运行完了，跟踪了一下发现是其中一个测试用例所使用的Entity Bean会连带初始化其他十几个Entity Bean，而且其中有几个Entity Bean的初始数据非常的多，每一个都有300条数据，这样要初始化好需要3分钟，而每个test方法都会来这么一次初始化。后来想着加Cache，Entity Bean填充好以后就缓存起来，后面的test方法再需要初始化的时候就直接进行对象拷贝就可以了，但是Entity Bean在使用的时候会修改一些值，这样如果发生变化的话应该从Cache里面清除，而且需要连带清除所有的Entity Bean。原来缓存的是MockEJB动态创建的Proxy对象，所以要进行对象复制不容易，看了MockEJB的源代码本来想自己也创建一个新的Proxy对象进行复制保存，但是工作量比较大，后来想到的解决的办法就是把对象的属性都复制到一个Map里面，主键是属性的名字，值就是对象值，如果值是集合类型，那么要创建一个同样的集合类并发那个集合里面的全部值加进去。 上面是我在公司的时候的解决方案，在写这篇日志的时候，又想到可能的其他方法，例如初始化Entity Bean的时候不初始化相关的其他的Entity Bean，只有在需要的时候才初始化（增加一个BaseGetterAspect，就像其他的Aspect一样）；另外就是在发布Entity Bean的时候不初始化所有的Entity Bean实例，只有在需要使用到那个实例的时候再初始化。当然这两个也不是那么简单就可以实现的，明天还要再好好的考虑下哪种最保险最简单。 在遇到一个问题的时候，解决方案是多种多样的，只要你敢想。：）]]></description>
			<content:encoded><![CDATA[<p class='fp'>今天在写测试的用例的时候发现框架的一个Bug，<a href="http://www.jiehoo.com/cmp-container-based-on-mockejb.htm">CMP在初始化Entity Bean的时候会自动初始化相关的Entity Bean</a>，但是如果是在一对多的情况下，首先使用的如果是一那端的情况下，不会自动的初始化多那一端的Entity Bean，后来添加了代码修正这个问题后，发现原来只要2分钟运行的所有的测试用例要15分钟才能运行完了，跟踪了一下发现是其中一个测试用例所使用的Entity Bean会连带初始化其他十几个Entity Bean，而且其中有几个Entity Bean的初始数据非常的多，每一个都有300条数据，这样要初始化好需要3分钟，而每个test方法都会来这么一次初始化。后来想着加Cache，Entity Bean填充好以后就缓存起来，后面的test方法再需要初始化的时候就直接进行对象拷贝就可以了，但是Entity Bean在使用的时候会修改一些值，这样如果发生变化的话应该从Cache里面清除，而且需要连带清除所有的Entity Bean。原来缓存的是MockEJB动态创建的Proxy对象，所以要进行对象复制不容易，看了MockEJB的源代码本来想自己也创建一个新的Proxy对象进行复制保存，但是工作量比较大，后来想到的解决的办法就是把对象的属性都复制到一个Map里面，主键是属性的名字，值就是对象值，如果值是集合类型，那么要创建一个同样的集合类并发那个集合里面的全部值加进去。</p>
<p>上面是我在公司的时候的解决方案，在写这篇日志的时候，又想到可能的其他方法，例如初始化Entity Bean的时候不初始化相关的其他的Entity Bean，只有在需要的时候才初始化（增加一个BaseGetterAspect，<a href="http://www.jiehoo.com/cmp-container-based-on-mockejb.htm">就像其他的Aspect一样</a>）；另外就是在发布Entity Bean的时候不初始化所有的Entity Bean实例，只有在需要使用到那个实例的时候再初始化。当然这两个也不是那么简单就可以实现的，明天还要再好好的考虑下哪种最保险最简单。</p>
<p>在遇到一个问题的时候，解决方案是多种多样的，只要你敢想。：）</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jiehoo.me/all-roads-lead-to-rome.htm/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
