为下拉式数据窗口建立缓冲区
张健姿 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(