Database 版 (精华区)
发信人: lizhenguo (夸父·追日), 信区: Database
标 题: 33
发信站: 哈工大紫丁香 (2001年09月26日18:47:41 星期三), 站内信件
bbs.hit.edu.cn
PowerBuilder专栏
[回到开始][上一层][下一篇]
----------------------------------------------------------------------------
----
发信人: carsam (独自偷...), 信区: Database
标 题: PowerBuilder应用开发系列讲座(33)
发信站: 逸仙时空 Yat-sen Channel (Wed Jan 5 12:36:09 2000), 站内信件
PowerBuilder应用开发系列讲座(33)
----------------------------------------------------------------------------
----
为下拉式数据窗口建立缓冲区(续)
同 其 他4GL 工 具 如Delphi,Visual Basic 的 早 期 版 本 一 样,PowerBui
lder4.0 以 前 所 生 成 的 可 执 行 文 件 使 用 是 伪 代 码, 也 称P-Code(ps
eudo-code)。P-Code 在 运 行 时 是 被 解 释 执 行 的, 更 准 确 地 说,P-Cod
e 使 用 的 是 虚拟 机 指 令, 为 不 同 的 宿 主 机 提 供 共 享 的 操 作 命 令
。 在 运 行时, 操 作 系 统 根 据 不 同 平 台 解 释 实 现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 在 执
行 机 器 代 码 时, 仍 使 用 共 享 的 函 数 库, 这 样 做 的 目 的主 要 是 为
了 节 省 内 存。 使 用 动 态 连 接 库 可 以 避 免 将 所 有的 功 能 函 数 都
写 在 一 个 可 执 行 文 件 中, 以 减 小 可 执 行 文件 的 体 积。 而 在Wind
ows 环 境 中, 内 存 中 留 有 一 份DLL 的 拷 贝可 以 为 多 个 应 用 程 序 使
用。 此 外PowerBuilder 5.0 还 压 缩 了 一些DLL 中 函 数 的 大 小, 现 在32
位 平 台 上 运 行 时 只 需7 个 动 态连 接 库, 解 压 缩 后 为4.5M。 应 用 所
需 要 的 其 它DLL 如 用 于 数据 库 访 问、 分 布 式PowerBuilder, 及RTF 编
辑 器 等 可 在 用 到 时 动态 地 装 入。
编 译 代 码 创 建
编 译 代 码 的 创 建 有 以 下 几 个 步 骤:
在 开 发 的 过 程 中,PowerScript 首 先 被 翻 译 成 了P-Code, 当您 在S
cript 编 辑 器 中 编 写 完 一 个 事 件 或 函 数 的 代 码 返 回 窗口 时, 系
统 就 会 自 动 地 翻 译 这 一 段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 的 属 性 中选 中"crea
te on demand" 这 个 复 选 框, 在 运 行 时, 只 有当 用 户 选 择 这 个TabPag
e,PowerBuilder 才 去 初 始 化 该TabPage 对 象的 实 例。
使 用DataStore 而 不 要 使 用 不 可 视 的DataWindow 作 为 数 据 的缓 冲 区。
传 递string、datetime 等 数 据 类 型 的 参 数 尽 可 能 使 用read-only 方 式,
因 为 同 采 用reference 方 式 相 比,PowerBuilder 无 需 为 这 些参 数 再 于
内 存 中 复 制 一 份 拷 贝。 同 理,reference 方 式 要 比value 法 传 参 更
快 一 些。
使 用 局 部 变 量 要 比 全 局 和 共 享 变 量 要 快 一 些, 因 为 局部 变 量
存 在 栈 中, 而 全 局 变 量 则 存 储 于 远 堆。 这 个 速 度 的差 异 在 使 用
机 器 代 码 时 比P-Code 更 为 明 显。
使 用 数 组 对DataWindow 的 数 据 进 行 赋 值, 而 不 要 使 用SetItem( ) 和G
etItem( ) 系 列 的 函 数, 因 为 前 者 只 使 用 了 一 次 函 数, 就调 用 了
所 有 的 行 和 列。
为 加 快 编 译 速 度, 不 要 在 一 个 事 件 或 函 数 中 编 写 过 长的 代 码,
将 它 们 分 成 几 个 函 数 或 其 他 可 重 用 的 代 码 对 象。
调 整 您 的 数 据 库。 一 般 来 说, 数 据 库 访 问 在 客 户/ 服 务器 结 构
的 应 用 中 要 占 用 大 量 的 时 间, 尽 可 能 利 用PowerBuilder 的 特 性 来
减 少 数 据 库 访 问 的 时 间, 包 括:
在5.0 中DBParm 缺 省 设 置StaticBind = 1, 也 就 是 说 在 检 索 数据 之 前,
PowerBuilder 并 不 首 先 获 取 查 询 数 据 结 果 集 结 构 的描 述, 这 样 作
可 以 提 高 数 据 的 检 索 速 度, 但 是 如 果 数 据 窗口 同 数 据 库 的 结
果 集 不 匹 配 时, 将 发 生 错 误。 因 此 如 果 您需 要 动 态 改 变 数 据
窗 口 所 查 询 的 表, 而 且 这 些 表 结 构 不同 时, 您 应 当 将StaticBind
的 值 设 置 为0。
DBParm 缺 省 设 置 允 许DataWindow 放 置BLOB 字 段, 使 用Data Pipeline 可 以
对 数 据 库 插 入BLOB 字 段 的 数 据。
通 过DBParm 的 设 置 可 以 使 数 据 库 支 持 游 标。 设 置DBParm SQLCache =
n 将 告 诉PowerBuilder 将 为 多 少 个 使 用 不 同SELECT 语 句 的 游 标建 立
缓 冲。 如 果 您 多 次 重 复 使 用 同 一 个SELECT 语 句, 当 缓 冲区 内 有 数
据 时, 检 索 的 速 度 将 大 大 加 快。SQLCache 的 缺 省 值为0。
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
中 的 一 种, 而 不 能 将 其 混 合 使 用, 不 过 唯 一 的 例 外是 使 用Powe
rBuilder 创 建OLE 服 务 器。
如 果 您 只 是 想 改 变 一 个DLL, 而 并 不 想 重 新 编 译 全 部 的应 用, 您
可 以 在Library 画 笔 中 选 择Library|Build Runtime Library... 的 菜 单 项。
在 编 译 时, 系 统 将 首 先 剔 除 注 释 语 句, 所 以Script 中 注释 语 句 的
多 少 对 编 译 速 度 没 有 影 响。
在 您 使 用PowerBuilder 的Plug-In 技 术 时, 您 不 能 使 用 编 译 代码。
--
我想自由自在地飞......
飞过大海...
飞过沙漠...
飞翔在星的夜空......
※ 来源:.逸仙时空 Yat-sen Channel bbs.zsu.edu.cn.[FROM: 202.116.90.29]
----------------------------------------------------------------------------
----
[回到开始][上一层][下一篇]
欢迎访问Cterm主页
--
《列子·汤问》:“夸父不量力,欲追日影,逐之于隅谷之际。渴欲 得饮,赴饮河渭
。河渭不足,将走北饮大泽。未至,道渴而死。”
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.229.154]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:211.367毫秒