需要使 PowerShell 脚本更快

2024-04-22

我自学了 Powershell,所以我不知道它的一切。

我需要搜索一个数据库,其中包含我输入的确切行数(数据库是预定义的),它包含 > 11800 个条目。

您能帮我找出是什么原因导致速度变慢吗?

Code:

$Dict = Get-Content "C:\Users\----\Desktop\Powershell Program\US.txt"

if($Right -ne "") {
    $Comb = $Letter + $Right
    $total = [int]0    
    $F = ""

    do {
        $F = $Dict | Select-Object -Index $total
        if($F.Length -eq $Num) {
            if($F.Chars("0") + $F.Chars("1") -eq $Comb) {
                Add-Content "C:\Users\----\Desktop\Powershell Program\Results.txt" "$F"
            }
        }
        $total++
        Write-Host $total
    } until([int]$total -gt [int]118619)

    $total = [int]0
    $F = ""
}

如何加快逐行搜索/匹配过程?我是通过多线程来做的吗?如果是这样怎么办?


看起来您在使用 powershell 之前至少已经了解一种其他语言,并且基本上是从在这一种语言中复制您可能在另一种语言中所做的事情开始的。这是学习新语言的好方法,但当然,一开始您可能会得到有点奇怪或性能不佳的方法。

首先我想分解一下你的代码实际上在做什么,作为一个粗略的概述:

  1. 一次读取文件的每一行并将其存储在$Dict多变的。
  2. 循环次数与行数相同。
  3. In each iteration of the loop:
    1. 获取与循环迭代匹配的单行(本质上是通过另一次迭代,而不是索引,稍后会详细介绍)。
    2. 获取该行的第一个字符,然后获取第二个字符,然后将它们组合起来。
    3. 如果它等于预先确定的字符串,则将此行附加到文本文件中。

步骤 3-1 才是真正减慢速度的原因

要了解原因,您需要了解一些有关 PowerShell 中的管道的知识。接受并在管道上工作的 Cmdlet 接受一个或多个对象,但它们一次处理一个对象。他们甚至无权访问管道的其余部分。

对于Select-Objectcmdlet。因此,当您获取一个包含 18,500 个对象的数组并将其通过管道传输到Select-Object -Index 18000,您需要发送 17,999 件物品进行检查/处理,然后它才能给您您想要的物品。您可以看到索引越大,所花费的时间就会变得越来越长。

由于您已经有一个数组,因此您可以通过带方括号的索引直接访问任何数组成员[]像这样:

$Dict[18000]

对于给定的数组,无论索引是什么,都需要相同的时间。

现在只需一次调用Select-Object -Index即使索引非常大,您也可能不会注意到它需要多长时间;问题是你已经循环遍历了整个数组,所以这会大大加剧。

You're essentially having to do the sum of 1..18000 which is about or approximately 162,000,000 iterations! (thanks to user2460798 https://stackoverflow.com/users/2460798/user2460798 for correcting my math)

Proof

我测试了这个。首先,我创建了一个包含 19,000 个对象的数组:

$a = 1..19000 | %{"zzzz~$_"}

然后我测量了两种访问它的方法。首先,与select -index:

measure-command { 1..19000 | % { $a | select -Index ($_-1 ) } | out-null }

Result:

TotalMinutes      : 20.4383861316667
TotalMilliseconds : 1226303.1679

然后使用索引运算符 ([]):

measure-command { 1..19000 | % { $a[$_-1] } | out-null }

Result:

TotalMinutes      : 0.00788774666666667
TotalMilliseconds : 473.2648

结果非常惊人,需要长了近 2,600 倍 to use Select-Object.

一个计数循环

以上是导致您的速度大幅下降的唯一原因,但我想指出其他一些事情。

通常在大多数语言中,您会使用for循环计数。在 PowerShell 中,这看起来像这样:

for ($i = 0; $i -lt $total ; $i++) {
    # $i has the value of the iteration
}

简而言之,里面有3个说法for环形。第一个是在循环开始之前运行的表达式。$i = 0将迭代器初始化为0,这是第一个语句的典型用法。

接下来是条件句;这将在每次迭代中进行测试,如果返回 true,循环将继续。这里$i -lt $total比较检查以查看$i小于 的值$total,其他地方定义的其他变量,大概是最大值。

最后一条语句在循环的每次迭代中执行。$i++是相同的$i = $i + 1所以在这种情况下我们要增加$i在每次迭代中。

它比使用 a 更简洁一些do/until循环,并且更容易理解,因为 a 的含义for循环是众所周知的。

其他注意事项

如果您有兴趣了解更多反馈working你写的代码,看看代码审查 https://codereview.stackexchange.com/。发帖前请仔细阅读那里的规则。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

需要使 PowerShell 脚本更快 的相关文章

  • 为什么在我的例子中 For 循环比 Map、Reduce 和 List 理解更快

    我编写了一个简单的脚本来测试速度 这就是我发现的结果 实际上 for 循环在我的例子中是最快的 这真的让我感到惊讶 请查看下面 正在计算平方和 这是因为它在内存中保存列表还是有意为之 谁能解释一下这一点 from functools imp
  • powershell 将文件添加到 zip

    我正在尝试使用 powershell 将文件添加到 zip 文件 我可以创建 zip 文件 但无法弄清楚如何将我的文件添加到其中 我在用着 zipfilename c cwRsync backup zip file c cwRsync ba
  • 使用 Powershell 远程安装 .msi

    我已经让他使用这个论坛上存在的代码来跟踪代码 cls computername Get Content C Users C201578 db Documents server txt sourcefile iceopsnas LNT Sof
  • isinstance(foo,types.GeneratorType)还是inspect.isgenerator(foo)?

    Python中似乎有两种方法来测试一个对象是否是生成器 import types isinstance foo types GeneratorType or import inspect inspect isgenerator foo 本着
  • MySQL InnoDB 查询性能

    我正在尝试优化一个简单的 sql 查询 该查询将多次运行大量数据 这是场景 MySQL 与 InnoDB 表 where 和 join 中使用的所有字段都已索引 表有 FK 我不需要查询的整个缓存 但每个表的缓存是可能的 表有更多的更新 插
  • IEnumerable 作为 DataTable 性能问题

    我有以下扩展 它生成一个DataTable从一个IEnumerable public static DataTable AsDataTable
  • 用于验证 IIS 设置的 Powershell 脚本

    是否可以使用 Power Shell 脚本获取 IIS 设置 我希望使用脚本获取 检查以下信息 检查 Windows 身份验证提供程序是否正确列出 协商 NTLM 检查是否启用了 Windows 身份验证 Windows 身份验证高级设置
  • iOS 自定义单元格设计放在哪里? awakeFromNib 还是 cellForRowAtIndexPath?

    所以 基本上我用笔尖做了一个定制单元 希望我应用一些定制设计 比如颜色和阴影 我发现了两种应用样式的方法 awakeFromNib override func awakeFromNib super awakeFromNib Containe
  • 嵌套辅助函数和性能

    嵌套辅助函数对于使代码更易于理解非常有用 谷歌甚至建议在他们的应用程序中使用嵌套函数时尚指南 https google styleguide googlecode com svn trunk javascriptguide xml Nest
  • 使用Powershell访问远程Oracle数据库

    我需要能够连接到我的网络上基于 Windows 7 的 Oracle 服务器 32 位 Oracle XE 我需要连接的机器运行 Windows 7 64 位 两台机器上都安装了 Powershell 我已在 64 位计算机上安装了 Ora
  • .NET 中 UniqueQueue 和 UniqueReplacementQueue 集合最有效的实现

    考虑到入队和出队操作的速度同样重要 NET 中 UniqueQueue 和 UniqueReplacementQueue 集合最有效 就速度而言 的实现是什么 UniqueQueue是一个不可能出现重复的队列 因此 如果我将一个元素推送到队
  • Powershell 脚本无法从 SCCM 正常运行 [已关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • 在 Windows 上不使用 OpenSSL 从 pfx 文件或证书存储中提取私钥

    正如标题所示 我想在不使用 OpenSSL 或任何其他第三方工具的情况下导出我的私钥 如果我需要一个 cer文件或 pfx我可以通过 MMC 或 PowerShell 轻松导出这些文件pkiclient但我找不到获取私钥的方法 https
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • SQLite .NET 性能,如何加快速度?

    在我的系统上 约 86000 个 SQLite 插入需要长达 20 分钟 意味着每秒约 70 个插入 我要做数百万 我怎样才能加快速度 对每一行的 SQLiteConnection 对象调用 Open 和 Close 会降低性能吗 交易有帮
  • 找到对应的未经V8优化的JS代码源

    我尝试优化 node js 应用程序的性能 因此我正在分析 V8 的 JIT 编译器的行为 当通过运行应用程序时node trace deopt trace opt code comments print optcode 输出包含许多重复出
  • jQuery mousemove 性能 - 节流事件?

    我们面临着与 mousemove 连接的 jQuery 事件传播性能问题 我们有一个屏幕填充画布 需要跟踪用户是否在其上拖动鼠标 因此我们在该对象上添加了一个鼠标移动侦听器 如下所示 ourCanvas on mousemove funct
  • 隐藏类以及 {} 对象与自定义构造函数之间的等效性 (v8)

    鉴于这篇文章 http richardartoul github io jekyll update 2015 04 26 hidden classes html http richardartoul github io jekyll upd
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • 在 PowerShell 中从文件名中删除路径和扩展名

    我有一系列字符串 它们是文件的完整路径 我想只保存文件名 不保存文件扩展名和主路径 所以由此可知 c temp myfile txt to myfile 我实际上并没有遍历目录 在这种情况下类似于 PowerShell 的目录basenam

随机推荐

  • 将 SSL 连接到子域 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我已为我的主域分配了 SSL 我想知道是否可以将 SSL 用于我的子域 我坦白地尝试了一下 但它显示警告页面 说该页面不安全等等 有没有解决方案 以便
  • 如何使用故事板通过自定义图像设置 iPhone 选项卡栏图标

    我是 iphone 开发的新手 我需要在标签栏中放置一个自定义图像图标 但它只显示默认颜色 黑色和蓝色 帮助我克服这个错误朋友 在应用程序中添加图像 并参见附图
  • 如何在hadoop/map reduce中创建固定行数的输出文件?

    假设我们有 N 个具有不同行数的输入文件 我们需要生成输出文件 使得每个输出文件恰好有 K 行 最后一个输出文件可以有 是否可以使用单个 MR 作业来完成此操作 我们应该打开文件以便在reducer中显式写入 输出中的记录应该被打乱 tha
  • 父子表记录-构建SQL查询

    这是我的表格和这些表格的数据 表名 Code CID Code 1 abc 2 def 3 xyz 表名 Details ID Name CID 1 a 1 2 b 2 结果表 ID Code Name 1 abc a 2 abc Null
  • 数据库中的额外查询或额外列哪个更好?

    对于可用时间非常短的数据来说 额外的查询或数据库中的额外列更好 示例 在子用户管理的情况下 我在主用户 表中添加一列额外的 super user id 并在用户类型为 sub user 且默认列值为 1 时进行输入 或者我创建新表并管理该表
  • 您如何处理标准库的signed char -> int 问题?

    这是我工作中一个长期存在的问题 我意识到我still没有好的解决办法 C 天真地为 int 定义了它的所有字符测试函数 int isspace int ch 但是字符通常是带符号的 并且完整的字符通常不适合 int 或用于字符串的任何单个存
  • 如何渲染响应?

    我正在使用 render to response 将列表发送到模板 我正在使用 django 快捷方式 锄头要这么做吗 如何使用变量设置上下文实例 from django shortcuts import render to respons
  • C#:将设置导入文件/从文件导出设置

    从应用程序内将应用程序内部设置导入 导出到文件中的最佳方法是什么 我有 Settings settings 文件 与设置文件绑定的 winform UI 并且我想要导入 导出设置 类似于 Visual Studio 导入 导出设置功能 如果
  • 如何测试 ANT 中的目录是否为空?

    如何测试 ant 中的目录是否为空 您可以使用pathconvert http ant apache org manual Tasks pathconvert html任务来做到这一点 与setonempty财产
  • Lua中如何对数字表求和?

    Lua有内置的吗sum 功能 我似乎找不到一个 我几乎翻遍了文档中的所有地方 或许table sum 或类似的东西 以遵循当前的约定 但由于我找不到它 我不得不实现它 function sum t local sum 0 for k v i
  • Magento - 检查管理员和客户是否登录

    我有一个安装了 Magento 1 4 0 1 的 Web 服务器 我有另一个与之共享凭据的网站 我已经设法检查客户是否登录 在更改 Magento 中的 cookie 位置之后 但是当我还尝试确定管理员是否登录时 事情变得复杂 我只能得到
  • 当标题顺序更改时,带有状态保存的数据表过滤器会导致问题

    我有一个html页面和一些 javascript 代码 下面是我的工作html table class table table hover thead tr th class color white Employee ID th th cl
  • 检查用户是否是 SQL Server 中 dbo 角色的成员

    我需要一个 T SQL 语句来检查用户是否是 SQL Server 中数据库角色的成员 具体来说 我需要知道用户是否是 dbo 角色的成员 因为这样我就不必向该用户授予额外的权限 如果我尝试在用户为 dbo 时添加额外权限 则会失败 并且我
  • 在同一端口上支持 IPv6 和 IPv4 的 C# 服务器

    是否有可能有一个同时侦听和接受 IPv6 和 IPv4 客户端的 Socket 我在 C 中使用了 IPv6 套接字 希望它能自动向后兼容 但 IPv4 客户端会导致无效的 ip 地址异常 看一看 您可以接受 IPv4 客户端以及 IPv6
  • 有关如何部署 C++ 代码以在任何地方工作的提示

    我不是在谈论制作可移植代码 这更多的是一个分配问题 我有一个中型项目 它对常用库有几个依赖项 例如 openssl zlib 等 它在我的机器上编译得很好 现在是时候将它呈现给世界了 本质上是构建最好的工程 我想制作适用于 Windows
  • 当所有其他列都保证相同时,仅从 CSV 文件中读取选定的列

    我有一堆 CSV 文件 我试图将它们连接成一个 csv 文件 CSV 文件由一个空格分隔 如下所示 initial pos orientation ratio chr 106681 0 06 chr 106681 0 88 chr 1066
  • 选择 Haskell 解析器

    有很多开源的解析器实现 http hackage haskell org packages archive pkg list html cat parsing我们可以在 Haskell 中使用 Parsec http hackage has
  • 编辑就地 Swing 组件

    有谁知道 Swing 组件本质上是电子表格 允许就地编辑并且可以 以某种方式 绑定到数组 如果您不需要任何花哨的东西 您可以使用标准秋千JTable 参见例如here http download oracle com javase tuto
  • 子视图图层变换和布局Subviews

    我的问题与 UIView CALayer 变换触发超级视图中的layoutSubviews https stackoverflow com questions 24632876 uiview calayer transform trigge
  • 需要使 PowerShell 脚本更快

    我自学了 Powershell 所以我不知道它的一切 我需要搜索一个数据库 其中包含我输入的确切行数 数据库是预定义的 它包含 gt 11800 个条目 您能帮我找出是什么原因导致速度变慢吗 Code Dict Get Content C