优化Ruby脚本效率实例分享

profile.rb是为Ruby程序准备的profiler,它可以统计并输出各方法的运行时间,以便于找到程序执行的性能瓶颈。这次就用它来剖析脚本的运行时间。使用方法很简单,加上命令行选项-r profile就可以:

ruby -r profile rename.rb
运行结束后,会把统计信息输出到标准错误输出中。如下图所示:

profile统计的是各方法的运行时间,分为2类。第1种计算的是从方法调用到方法返回之间的时间,称为整体时间;第2种则是从整体时间中扣除在该方法中调用其它方法所耗费时间之后得到的时间,称为实际时间。输出信息每行中各字段含义如下(从左到右):

该方法执行时间占整体时间的百分比,比例越高越说明这行代码可能需要优化

整体时间的总和

实际时间的总和

被调用的次数

每次调用的平均实际时间(毫秒)

每次调用的平均整体时间(毫秒)

方法名

由上图可以看出,脚本执行的时间大部分耗在了循环上。解决方法有两个:消除循环或减少循环次数。前者很难实现,暂且还没有想到办法,也许根本就没有可能。脚本中mapping的大小为2685,所以每修改一个文件名需要执行2685次循环,且循环中的encode和gsub!都是耗时操作。通常文件名的长度不超过30个字符,通过遍历文件名中每个字符的方式重命名就可以把循环次数缩减到不超过30次。

修改代码后重新执行分析命令,得到的结果是脚本运行时间从379395秒优化到2418秒,性能整整提升了156倍,达到2个数量级的效果。

(0)

相关推荐

  • ruby开发vim插件小结

    在开始编写插件之前,你需要确认 Vim 是否支持 Ruby,通过以下命令来判别: $ vim --version | grep +ruby 如果输出为空,则表示你当前的vim不支持Ruby,需要重新编译一下,并启用对Ruby的支持. 顺便说下我当前的环境是: vim 7.4 ruby 2.1.0 环境检查没有问题那么就开始吧. 在~/.vim/plugin目录下创建一个 demo.vim 文件. 在开头写上以下代码: if !has('ruby') echo "Error: Required v

  • Ruby On Rails中如何避免N+1问题

    N+1问题 N+1问题是数据库访问中最常见的一个性能问题,首先介绍一下什么是N+1问题: 举个例子,我们数据库中有两张表,一个是Customers,一个是Orders.Orders中含有一个外键customer_id,指向了Customers的主键id. 想要得到所有Customer以及其分别对应的Order,一种写法是 SELECT * FROM Customers; 对于每一个Customer: SELECT * FROM Orders WHERE Orders.customer_id =

  • 分析Cache 在 Ruby China 里面的应用情况

    首先给大家看一下 NewRelic 的报表 最近 24h 的平均响应时间 流量高的那些页面 (Action) 访问量搞的几个 Action 的情况: TopicsController#show UsersController#show (比较惨,主要是 GitHub API 请求拖慢) PS: 在发布这篇文章之前我有稍加修改了一下,GitHub 请求放到后台队列处理,新的结果是这样: TopicsController#index HomeController#index 从上面的报表来看,目前

  • Java版的Ruby解释器 JRuby简介

    Rails彻底加快及简化了Web应用的开发,不过它让人觉得不够成熟,特别是在高端企业级功能方面.另一方面,Java平台及其虚拟机.库和 应用服务器的速度.稳定性和功能方面却一直在提升,现在已被公认为是开发高端服务器应用的领先平台.不过如果Java平台不与Ruby等新兴语言联系在一 起,就有可能落后于流行趋势. 示例代码: require "java" include_class "java.util.TreeSet" include_class "com.

  • ruby执行周期性任务的三种gem介绍

    1.whenever 首先,whenever是基于linux的cron服务的,所以,在windows平台上没有直接的方法使用该gem.whenever严格来说应该算一个cron的翻译器,将ruby代码翻译为cron脚本,从而将周期性任务转交给cron实际去完成.对于精通cron的shell程序员来说可能不值一提,但对rubyist却不是.首先,我们可以使用ruby语言来书写任务代码,在ruby层面上控制代码,避免了和一些shell脚本的切换:另外,cron命令很强大,但我总是记不住它的命令参数,

  • 优化Ruby脚本效率实例分享

    profile.rb是为Ruby程序准备的profiler,它可以统计并输出各方法的运行时间,以便于找到程序执行的性能瓶颈.这次就用它来剖析脚本的运行时间.使用方法很简单,加上命令行选项-r profile就可以: ruby -r profile rename.rb 运行结束后,会把统计信息输出到标准错误输出中.如下图所示: profile统计的是各方法的运行时间,分为2类.第1种计算的是从方法调用到方法返回之间的时间,称为整体时间:第2种则是从整体时间中扣除在该方法中调用其它方法所耗费时间之后

  • MySql批量插入优化Sql执行效率实例详解

    MySql批量插入优化Sql执行效率实例详解 itemcontractprice数量1万左右,每条itemcontractprice 插入5条日志. updateInsertSql.AppendFormat("UPDATE itemcontractprice AS p INNER JOIN foreigncurrency AS f ON p.ForeignCurrencyId = f.ContractPriceId SET p.RemainPrice = f.RemainPrice * {0},

  • JavaScript中Require调用js的实例分享

    在我最初开始写 JavaScript 函数时,通常是这样的: function fun1() { // some code here } function fun2() { // some other code here } ... 函数全写在全局环境中,项目很小时,通常不会有什么冲突问题. 但代码多了后,渐渐就发现,函数名称(英文词汇)有点不够用了.于是引入命名空间的概念,开始模块化代码. 命名空间下的函数 在命名空间下,我的代码这样写: var com = com || {}; com.zf

  • PHP优化之批量操作MySQL实例分析

    本文实例讲述了PHP优化之批量操作MySQL.分享给大家供大家参考,具体如下: 设计一个数据表如下: create table optimization( id INT NOT NULL AUTO_INCREMENT, value VARCHAR(10) NOT NULL, PRIMARY KEY(id) ); 现在有一个业务需求需要批量插入数据. 先来看看下面这一段代码: <?php $dsn = 'mysql:dbname=test;host=127.0.0.1'; $user = 'roo

  • javascript性能优化之事件委托实例详解

    本文实例分析了javascript性能优化之事件委托.分享给大家供大家参考,具体如下: 为下面每个LI绑定一个click事件 <ul id="myLinks"> <li id="goSomewhere" >Go somewhere</li> <li id="doSomething" >Do something</li> <li id="sayHi" >Sa

  • 对优化Ruby on Rails性能的一些办法的探究

    1.导致你的 Rails 应用变慢无非以下两个原因: 在不应该将 Ruby and Rails 作为首选的地方使用 Ruby and Rails.(用 Ruby and Rails 做了不擅长做的工作) 过度的消耗内存导致需要利用大量的时间进行垃圾回收. Rails 是个令人愉快的框架,而且 Ruby 也是一个简洁而优雅的语言.但是如果它被滥用,那会相当的影响性能.有很多工作并不适合用 Ruby and Rails,你最好使用其它的工具,比如,数据库在大数据处理上优势明显,R 语言特别适合做统计

  • 对Python 网络设备巡检脚本的实例讲解

    1.基本信息 我公司之前采用的是人工巡检,但奈何有大量网络设备,往往巡检需要花掉一上午(还是手速快的话),浪费时间浪费生命. 这段时间正好在学 Python ,于是乎想(其)要(实)解(就)放(是)双(懒)手. 好了,脚本很长又比较挫,有耐心就看看吧. 需要巡检的设备如下: 设备清单 设备型号 防火墙 华为 E8000E H3C M9006 飞塔 FG3950B 交换机 华为 S9306 H3C S12508 Cisco N7K 路由器 华为 NE40E 负载 Radware RD5412 Ra

  • shell在指定目录下批量执行sql脚本的实例

    如下所示: #!/bin/bash #execute all script in specified directory MYDATE=`date +%F'-'%T'-'%w` MYSQL_PATH=/tmp/scripts #指定的目录 LOG_FILE=/tmp/scripts/exec_${MYDATE}.log confirm= db_name= db_pass= for file in ${MYSQL_PATH}/* do if [ -f "$file" ] ; then p

  • python钉钉机器人运维脚本监控实例

    如下所示: #!/usr/bin/python3 # -*- coding:UTF-8-*- # Author: zhuhongqiang from urllib import request import json from sys import argv access_token = "xxx" def send_msg(mobile, item_name): """ 钉钉机器人API接口地址: https://open-doc.dingtalk.co

  • python redis 删除key脚本的实例

    单机模式 代码片段 安装 pip install redis import redis r = redis.Redis(host='192.168.1.3', port=6188,db=0,decode_responses=True) list_keys = r.keys("DEMO_xx_*") for key in list_keys: r.delete(key) 集群模式 代码片段 安装 pip install redis-py-cluster from rediscluster

随机推荐