2012年8月2日 星期四

SyntaxHighlighter 3.0.83 的設定

2009 年設定使用 SyntaxHighlighter 時,我選擇了 2.0.320 這個版本,然後就一直這麼用到最近,只是偶爾會覺得它載入頁面有點慢。這兩天發現 SyntaxHighlighter 早在 2010 年改版成 3.0.83 版,爬了爬文又反覆測試之後,終於將 SyntaxHighlighter 3.0.83 設定完成。

然後,我又將從 2009 年開始到現在的文章全部翻看一遍,只有幾篇用了 SyntaxHighlighter 耶!

噗~~~ 我還以為會有很多篇呢?這幾篇剛好讓我拿來測試 SyntaxHighlighter 的設定。

以下也記錄改成 SyntaxHighlighter 3.0.83 時,在部落格版面的範本裡添加的內容:

<link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css"></link>
<link href="http://alexgorbatchev.com/pub/sh/current/styles/shCoreDefault.css" rel="stylesheet" type="text/css"></link>
<link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" id="shTheme" rel="stylesheet" type="text/css"></link>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shAutoloader.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushAS3.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCSharp.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushDiff.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJavaFX.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPlain.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPowerShell.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPython.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushRuby.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushScala.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushVb.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js" type="text/javascript"></script>
<style>
.highlightsetting {
    overflow-x: auto !important; /*修正下邊滾動條之 BUG*/
    overflow-y: hidden !important; /*修正右側滾動條之 BUG*/
    border: 1px solid #2187BB; /*加入程式碼邊框*/
}
.highlightsetting .line.alt1 {
    background-color: #EEE !important; /*这个表示奇数行颜色*/
}
.highlightsetting .line.alt2 {
    background-color: white !important; /*这个表示偶数行颜色*/
}
</style>
<script type="text/javascript">
    SyntaxHighlighter.config.bloggerMode = true;
    SyntaxHighlighter.defaults["class-name"]="highlightsetting"; // 自定義 CSS 設置
    SyntaxHighlighter.defaults["auto-links"]=false; // 超連結設定顯示為文字
    SyntaxHighlighter.config.space=" "; // 消除 Chrome 複製時的 BUG 空白
    SyntaxHighlighter.config.stripBrs=false; // 略過 Blogger 之 br 標籤
    SyntaxHighlighter.all();
</script>

2012年8月1日 星期三

Linux 的 time 指令

Linux 有個很有意思的 time 指令,可以用來查看另一個指令的執行時間,例如執行 time helloworld 會顯示 helloworld 這支程式的執行時間。

time 指令的返回值包含「實際時間 (real time)」、「用戶態 CPU 時間 (user CPU time)」及「核心態 CPU 時間 (system CPU time)」。其中,

  • real time 表示後面所接的指令或程式從開始執行到結束終止所需要的時間。簡單講,當一個程式開始執行瞬間看一下手錶記下時間,當程式結束終止瞬間再看一次手錶,兩次的時間差就是 real time。
  • user CPU time 表示程式在 user mode 所佔用的 CPU 時間總和。多核心的 CPU 或多顆 CPU 計算時,則必須將每一個核心或每一顆 CPU 的時間加總起來。
  • system CPU time 表示程式在 kernel mode 所佔用的 CPU 時間總和。

所以,以下的想法就不一定成立:

一:real time = user CPU time + system CPU time

這裡舉一個比較極端的例子,假設我執行 time sleep 10 這個命令,time 會返回給我的訊息如下:

real    0m10.003s
user    0m0.004s
sys     0m0.000s 

因為動作是「睡 (sleep)」10 秒,從 sleep 指令下達到它結束終止共經過 10 秒,所以 real time 的值是 10 秒。但,sleep 指令在 user mode 及 kernel mode 都沒有佔用 CPU,所以 user CPU time 和 system CPU time 基本上都是「零」。

二:real time > user CPU time + system CPU time

這個式子若是在單核心、單顆的 CPU 上,通常有成立的可能。

但,在多核心或多顆 CPU 的環境,卻往往可能出現 user CPU time + system CPU time > real time 的狀況。甚至我們在編譯大量的程式時,經常執行 time make -j2time make -j4 的指令,往往得到的 user CPU time 值都可能大過 real time 值。

延伸閱讀: