爲下拉式數據窗口建立緩衝區

爲下拉式數據窗口建立緩衝區


張健姿
01-6-22 下午 04:47:33


同 其 他4GL 工具 如Delphi,Visual Basic 的 早 期 版 本 一 樣,PowerBuilder4.0 以 前 所 生成 的 可 執 行 文 件 使 用 是 僞 代 碼, 也 稱P-Code(pseudo-code)。P-Code 在 運 行 時 是 被 解 釋 執 行 的, 更 準 確 地 說,P-Code 使 用 的是 虛 擬 機 指 令, 爲 不 同 的 宿 主 機 提 供 共 享 的 操 作 命令。 在 運 行 時, 操 作 系 統 根 據 不 同 平 臺 解 釋 實 現P-Code 指 令。 一 條P-Code 指 令 可 以 替 代 幾 條 機 器 代 碼 指 令, 這樣 就 減 少 了 執 行 代 碼 的 大 小, 不 過 卻 以 應 用 的 執 行 效率 爲 代 價。 一 般 的,P-Code 的 執 行 速 度 要 慢 於 編 譯 代 碼,但 文 件 的 大 小 卻 小 於 編 譯 代 碼。
PowerBuilder 5.0 引入 了 生 成 全 編 譯 的 可 執 行 代 碼 的 功 能, 以 提 高 運 行 效率, 但 同 時 它 也 保 留 了 使 用P-Code 爲 可 執 行 文 件 的 功能。 使 用P-Code 的 應 用 程 序 包 括 執 行 文 件.EXE 和PowerBuilder 的動 態 連 接 庫.PBD, 而 編 譯 代 碼 所 產 生 的 執 行 文 件 爲.EXE 文件 和 動 態 連 接 庫DLL。
什 麼 是 編 譯 代 碼
編 譯 代 碼 首先 以P-Code 爲 基 礎,PowerBuilder 首 先 根 據P-Code 創 建C 代 碼, 然 後將C 代 碼 編 譯 成 爲 機 器 代 碼 的 執 行 文 件。 編 譯 後 的 執行 程 序 中, 所 有 指 令 都 是 實 際 的 機 器 代 碼。 這 就 意 味着 這 樣 的 執 行 文 件 的 大 小 將 遠 大 於P-Code。
使 用 編 譯 代碼 仍 需 要PowerBuilder 的 運 行 庫,PowerBuilder 在 執 行 機 器 代 碼時, 仍 使 用 共 享 的 函 數 庫, 這 樣 做 的 目 的 主 要 是 爲 了節 省 內 存。 使 用 動 態 連 接 庫 可 以 避 免 將 所 有 的 功 能 函數 都 寫 在 一 個 可 執 行 文 件 中, 以 減 小 可 執 行 文 件 的 體積。 而 在Windows 環 境 中, 內 存 中 留 有 一 份DLL 的 拷 貝 可 以爲 多 個 應 用 程 序 使 用。 此 外PowerBuilder 5.0 還 壓 縮 了 一 些DLL 中 函 數 的 大 小, 現 在32 位 平 臺 上 運 行 時 只 需7 個 動 態 連接 庫, 解 壓 縮 後 爲4.5M。 應 用 所 需 要 的 其 它DLL 如 用 於 數據 庫 訪 問、 分 布 式PowerBuilder, 及RTF 編 輯 器 等 可 在 用 到 時動 態 地 裝 入。
編 譯 代 碼 創 建
編 譯 代 碼的 創 建 有 以 下 幾 個 步 驟:
在 開 發 的 過 程 中,PowerScript 首 先 被翻 譯 成 了P-Code, 當 您 在Script 編 輯 器 中 編 寫 完 一 個 事 件 或函 數 的 代 碼 返 回 窗 口 時, 系 統 就 會 自 動 地 翻 譯 這 一 段Script 代 碼。 當 您 在 工 程 畫 筆 中 創 建P-Code 可 執 行 文 件 時,PowerBuilder 將 爲 不 同 的PBL 中 不 同 對 象 之 間 的 引 用 建 立 起 連 接, 並將 這 些 對 象 拷 貝 到 指 定 的EXE 或PBD 文 件 中。 這 是 一 個 相對 較 快 的 過 程。
接 下 來P-Code 將被 翻 譯 成 爲C 語 言 的 語 句。 在 這 一 過 程 中, 工 程 畫 筆 窗口 下 面 的 微 幫 助 中 將 顯 示"compiling ... " 的 字 樣, 這一 過 程 約 佔 全 部 編 譯 時 間 的10 %。 然 後 是 將C 代 碼 編 譯和 鏈 接 成 爲 機 器 代 碼, 形 成 可 執 行 文 件 和 動 態 連 接庫, 在 這 一 步 驟 中, 微 幫 助 顯 示 的 是"generating...",這 一 編 譯 過 程 最 費 時 間, 將 佔 約90 % 的 編 譯 時 間。
通 過 上 面 的介 紹, 我 們 看 到 創 建 機 器 代 碼 所 用 的 時 間 比 產 生P-Code 的 用 時 要 多 得 多, 因 爲 後 者 只 是 一 個 二 進 制 代 碼 搬 運的 過 程。 因 此 在 開 發 過 程 中, 我 們 一 般 使 用 的 主 要 是P-Code,只 是 在 最 終 交 付 用 戶 使 用 時, 才 根 據 實 際 情 況 選 擇 是否 創 建 機 器 代 碼。
編 譯 代 碼的 優 勢:
在 以 下 這 幾 個 方 面, 將PowerScript 代碼 編 譯 成 爲 機 器 代 碼 將 得 到 較 快 的 運 行 速 度:
· 循 環 結 構
· 浮 點 運 算
· 整 數 運 算
· 函 數 調 用
但 是 在 另 外的 一 些 方 面, 編 譯 成 爲 機 器 代 碼 並 不 能 使 運 行 速 度 明顯 加 快, 如 涉 及 圖 形 用 戶 界 面, 數 據 庫 訪 問, 小 數 運算, 字 符 串 操 作 等。 在 有 些 情 況 下, 兩 種 代 碼 的 速 度是 相 同 的, 如 對 資 源 的 調 用 和 對 數 據 窗 口 的 執 行。 在這 些 情 況 下, 您 就 無 法 通 過 使 用 編 譯 代 碼 來 提 高 運 行的 速 度 了。
如 果 您 的 應用 是 以 執 行 自 身 的 代 碼 爲 主, 例 如 應 用 中 較 多 的 是 同一 條 代 碼 被 反 復 執 行( 如 循 環) 或 是 編 寫 的 代 碼 主 要用 來 進 行 數 學 運 算, 這 樣 的 應 用 應 當 使 用 編 譯 代 碼。在 函 數 調 用 方 面, 使 用 機 器 碼 也 要 比P-Code 快 得 多。 因此 如 果 您 的Script 大 量 的 調 用 函 數 或 是 採 用 新 的 語 法 形式 調 用 事 件, 使 用 機 器 碼 也 將 是 個 好 的 選 擇。 不 過 您應 當 記 住, 編 譯 代 碼 的 執 行 文 件 大 小 要 比P-Code 大 得多, 因 爲 一 條PowerScript 代 碼 將 有 可 能 編 譯 成 爲5 條 甚 至10 條C 代 碼。 當 這 些C 代 碼 被 編 譯 後, 可 執 行 的 代 碼 將 遠遠 大 於 相 應 的P-Code, 因 此 如 果 您 的 應 用 程 序 的 文 件 大小 是 您 應 用 的 首 要 考 慮 因 素, 或 者 您 的 應 用 較 多 的 是數 據 庫 訪 問, 那 您 應 當 選 擇 使 用P-Code。
提 高 應 用 的 性 能
事 實 上, 一個 好 的 數 據 庫 的 物 理 設 計 和 應 用 程 序 的 模 塊 設 計 可以 大 大 地 提 高 應 用 的 性 能。 如 果 應 用 設 計 不 好, 即 使使 用 了 編 譯 代 碼, 也 不 會 得 到 很 好 的 系 統 性 能。 此 外調 整 系 統 參 數 設 置 和 合 理 的 物 理 帶 寬, 可 以 使PowerBuilder 5.0 的 應 用 運 行 得 十 分 快 捷。
在PowerBuilder 5.0 中, 系 統 內 部 已 經 在 一 些 功 能 上 進 行 了 增 強, 對 這 些功 能 加 以 利 用, 本 身 就 可 以 實 現 性 能 的 優 化。
· 使 用PowerBuilder 5.0 的Tab 控 件 時, 如 果 在TabPage 的 屬 性 中 選 中"create on demand" 這 個 復 選 框, 在 運 行時, 只 有 當 用 戶 選 擇 這 個TabPage,PowerBuilder 才 去 初 始 化 該TabPage 對 象 的 實 例。
· 使 用DataStore 而 不 要 使 用 不 可 視 的DataWindow 作 爲 數 據 的 緩 衝 區。
· 傳 遞string、datetime 等 數 據 類 型 的 參 數盡 可 能 使 用read-only 方 式, 因 爲 同 採 用reference 方 式 相 比,PowerBuilder 無 需 爲 這 些 參 數 再 於 內 存 中 復 制 一 份 拷 貝。 同 理,reference 方 式 要 比value 法 傳 參 更 快 一 些。
· 使 用 局 部 變 量 要 比 全 局 和 共 享 變 量要 快 一 些, 因 爲 局 部 變 量 存 在 棧 中, 而 全 局 變 量 則 存儲 於 遠 堆。 這 個 速 度 的 差 異 在 使 用 機 器 代 碼 時 比P-Code 更 爲 明 顯。
· 使 用 數 組 對DataWindow 的 數 據 進 行 賦值, 而 不 要 使 用SetItem( ) 和GetItem( ) 系 列 的 函 數, 因 爲 前 者只 使 用 了 一 次 函 數, 就 調 用 了 所 有 的 行 和 列。
· 爲 加 快 編 譯 速 度, 不 要 在 一 個 事 件或 函 數 中 編 寫 過 長 的 代 碼, 將 它 們 分 成 幾 個 函 數 或 其他 可 重 用 的 代 碼 對 象。
· 調 整 您 的 數 據 庫。 一 般 來 說, 數 據庫 訪 問 在 客 戶/ 服 務 器 結 構 的 應 用 中 要 佔 用 大 量 的 時間, 盡 可 能 利 用PowerBuilder 的 特 性 來 減 少 數 據 庫 訪 問 的 時間, 包 括:
1. 在5.0 中DBParm 缺 省 設 置StaticBind = 1, 也 就是 說 在 檢 索 數 據 之 前,PowerBuilder 並 不 首 先 獲 取 查 詢 數 據結 果 集 結 構 的 描 述, 這 樣 作 可 以 提 高 數 據 的 檢 索 速度, 但 是 如 果 數 據 窗 口 同 數 據 庫 的 結 果 集 不 匹 配 時,將 發 生 錯 誤。 因 此 如 果 您 需 要 動 態 改 變 數 據 窗 口 所 查詢 的 表, 而 且 這 些 表 結 構 不 同 時, 您 應 當 將StaticBind 的值 設 置 爲0。
2. DBParm 缺 省 設 置 允 許DataWindow 放 置BLOB 字段, 使 用Data Pipeline 可 以 對 數 據 庫 插 入BLOB 字 段 的 數 據。
3. 通 過DBParm 的 設 置 可 以 使 數 據 庫 支 持遊 標。 設 置DBParm SQLCache = n 將 告 訴PowerBuilder 將 爲 多 少 個 使 用不 同SELECT 語 句 的 遊 標 建 立 緩 衝。 如 果 您 多 次 重 復 使 用同 一 個SELECT 語 句, 當 緩 衝 區 內 有 數 據 時, 檢 索 的 速 度將 大 大 加 快。SQLCache 的 缺 省 值 爲0。
4. PowerBuilder 5.0 中 對 數 據 窗 口 有 了 這 樣的 一 個 選 項, 可 以 將 數 據 窗 口 的 結 果 集 保 存 在 本 地 磁盤 上。 這 樣 作 可 以 減 少 內 存 的 使 用, 使 您 創 建 更 大 的報 表, 不 過 存 取 速 度 比 將 結 果 集 放 在 內 存 中 要 慢 得多。 如 果 您 的 數 據 窗 口 將 顯 示 的 不 是 一 個 很 大 的 報表, 一 般 還 是 將 結 果 集 放 在 內 存 中 爲 佳。
其 它 的 注 意 事 項
對 於 用 戶 使用PowerBuilder 編 譯 代 碼, 還 有 以 下 幾 點 值 得 說 明:
· PowerBuilder 產 生 編 譯 代 碼 的 速 度 很 慢,應 盡 可 能 使 用 主 頻 較 快 的 計 算 機, 最 多 至64M 內 存, 不過 在5.0 的 版 本 中, 多CPU 對 提 高 編 譯 速 度 沒 有 任 何 幫助。
· PowerBuilder 所 使 用 的Watcom 的 技 術 主 要 是32 位 的 技 術, 盡 管 在32 位 平 臺 上 有 生 成16 位 代 碼 的 選 項,但 是 速 度 卻 並 不 見 佳。 另 外 在16 位 平 臺 上, 我 們 不 能產 生32 位 的 應 用 程 序。
· 編 譯16 位 應 用 程 序 有 一 個 限 制 就 是代 碼 和 數 據 都 不 能 超 過64K, 如 果 函 數 或 事 件 中 的 代 碼過 長,PowerBuilder 在 創 建EXE 時 將 產 生 錯 誤。 我 們 推 薦 的 解決 辦 法 就 是 將 長 代 碼 分 解 成 多 個 小 函 數, 這 樣 做 也 可以 提 高 運 行 效 率 並 有 利 於 您 對 應 用 代 碼 的 維 護。
· 如 果 您 在Windows NT 或Windows 95 上 運 行16 位應 用 程 序, 您 所 使 用 的 運 行 庫 也 應 當 是16 位 的。
· 在 一 個PowerBuilder 應 用 中 我 們 只 能 使 用P-Code 的PBD 或 編 譯 代 碼DLL 中 的 一 種, 而 不 能 將 其 混 合 使 用,不 過 唯 一 的 例 外 是 使 用PowerBuilder 創 建OLE 服 務 器。
· 如 果 您 只 是 想 改 變 一 個DLL, 而 並 不想 重 新 編 譯 全 部 的 應 用, 您 可 以 在Library 畫 筆 中 選 擇Library|Build Runtime Library... 的 菜 單 項。
· 在 編 譯 時, 系 統 將 首 先 剔 除 注 釋 語句, 所 以Script 中 注 釋 語 句 的 多 少 對 編 譯 速 度 沒 有 影響。
· 在 您 使 用PowerBuilder 的Plug-In 技 術 時, 您不 能 使 用 編 譯 代 碼。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章