Хэл Фултон - Программирование на языке Ruby

Здесь есть возможность читать онлайн «Хэл Фултон - Программирование на языке Ruby» — ознакомительный отрывок электронной книги совершенно бесплатно, а после прочтения отрывка купить полную версию. В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Москва, Год выпуска: 2007, ISBN: 2007, Издательство: ДМК Пресс, Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Программирование на языке Ruby: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Программирование на языке Ruby»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Ruby — относительно новый объектно-ориентированный язык, разработанный Юкихиро Мацумото в 1995 году и позаимствовавший некоторые особенности у языков LISP, Smalltalk, Perl, CLU и других. Язык активно развивается и применяется в самых разных областях: от системного администрирования до разработки сложных динамических сайтов.
Книга является полноценным руководством по Ruby — ее можно использовать и как учебник, и как справочник, и как сборник ответов на вопросы типа «как сделать то или иное в Ruby». В ней приведено свыше 400 примеров, разбитых по различным аспектам программирования, и к которым автор дает обстоятельные комментарии.
Издание предназначено для программистов самого широкого круга и самой разной квалификации, желающих научиться качественно и профессионально работать на Ruby.

Программирование на языке Ruby — читать онлайн ознакомительный отрывок

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Программирование на языке Ruby», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Нам нужны объективные измерения. Профилировщик нужен.

В комплект поставки Ruby входит профилировщик profile. Для его вызова достаточно включить библиотеку:

ruby -rprofile myprog.rb

Рассмотрим листинг 16.6. Эта программа открывает файл /usr/share/dict/wordsи ищет в нем анаграммы. Затем смотрит, у каких слов оказалось больше всего анаграмм, и распечатывает их.

Листинг 16.6. Поиск анаграмм в словаре

words = File.readlines("/usr/share/dict/words")

words.map! {|x| x.chomp }

hash = {}

words.each do |word|

key = word.split("").sort.join

hash[key] ||= []

hash [key] << word

end

sizes = hash.values.map {|v| v.size }

most = sizes.max

list = hash.find_all {|k,v| v.size == most }

puts "Ни у одного слова нет более #{most-1} анаграмм."

list.each do |key,val|

anagrams = val.sort

first = anagrams.shift

puts "Слово #{first} имеет #{most-1) анаграмм:"

anagrams.each {|a| puts " #{a}" }

end

num = 0

hash.keys.each do |key|

n = hash[key].size

num += n if n > 1

end

puts

puts "Всего слов в словаре: #{words.size},"

puts "из них имеют анаграммы: #{num}."

Наверняка вам интересно, какие получились результаты. Вот какие:

Ни у одного слова нет более 14 анаграмм.

Слово alerts имеет 14 анаграмм:

alters

artels

estral

laster

lastre

rastle

ratels

relast

resalt

salter

slater

staler

stelar

talers

Всего слов в словаре: 483523,

из них имеют анаграммы: 79537.

На моем компьютере этот файл содержит более 483000 слов, и программа работала чуть меньше 18 секунд. Как вы думаете, на что ушло это время? Попробуем выяснить. Профилировщик выдал более 100 строк, отсортированных в порядке убывания времени. Мы покажем только первые 20:

% cumulative self self total

time seconds seconds calls ms/call ms/call name

42.78 190.93 190.93 15 12728.67 23647.33 Array#each

10.78 239.04 48.11 1404333 0.03 0.04 Hash#[]

7.04 270.48 31.44 2 15720.00 25575.00 Hash#each

5.66 295.73 25.25 483523 0.05 0.05 String#split

5.55 320.51 24.78 1311730 0.02 0.02 Array#size

3.64 336.76 16.25 1 16250.00 25710.00 Array#map

3.24 351.23 14.47 483524 0.03 0.03 Array#sort

3.12 365.14 13.91 437243 0.03 0.03 Fixnum#==

3.04 378.72 13.58 483526 0.03 0.03 Array#join

2.97 391.98 13.26 437244 0.03 0.03 Hash#default

2.59 403.53 11.55 437626 0.03 0.03 Hash#[]=

2.43 414.38 10.85 483568 0.02 0.02 Array#<<

2.29 424.59 10.21 1 10210.00 13430.00 Array#map!

1.94 433.23 8.64 437242 0.02 0.02 Fixnum#<=>

1.86 441.54 8.31 437244 0.02 0.02 Fixnum#>

0.72 444.76 3.22 483524 0.01 0.01 String#chomp

0.11 445.26 0.50 4 125.00 125.00 Hash#keys

0.11 445.73 0.47 1 470.00 470.00 Hash#values

0.06 446.00 0.27 1 270.00 270.00 IO#readlines

0.05 446.22 0.22 33257 0.01 0.01 Fixnum#+

Видно, что больше всего времени программа тратит в методе Array#each. Это понятно: ведь цикл выполняется для каждого слова и на каждой итерации делает довольно много. Среднее значение в данном случае сбивает с толку, поскольку почти все время уходит на первый вызов each, а остальные 14 (см. anagrams.each) выполняются очень быстро.

Мы также видим, что Hash#[]— дорогая операция (главным образом потому что часто выполняется); на 1.4 миллиона вызовов было потрачено почти 11 секунд.

Обратите внимание, что метод readlinesоказался чуть ли не в самом конце списка. Эта программа тратит время не на ввод/вывод, а на вычисления. На чтение всего файла ушло всего-то четверть секунды.

Но этот пример не показывает, в чем истинная ценность профилирования. В программе нет ни методов, ни классов. На практике вы, скорее всего, увидите свои методы среди системных. И тогда будете точно знать, какие из ваших методов находятся в числе первых 20 «пожирателей времени».

Надо ясно понимать, что профилировщик Ruby (видно, по иронии судьбы) работает медленно. Он подключается к программе во многих местах и следит за ее выполнением на низком уровне (причем сам написан на чистом Ruby). Так что не удивляйтесь, если ваша программа в ходе сеанса профилирования будет работать на несколько порядков медленнее. В нашем примере она работала 7 минут 40 секунд (460 секунд), то есть в 25 раз медленнее обычного.

Помимо профилировщика, есть еще один низкоуровневый инструмент — стандартная библиотека benchmark, которая тоже полезна для измерения производительности.

Один из способов ее применения — вызвать метод Benchmark.measureи передать ему блок.

require 'benchmark'

file = "/usr/share/dict/words"

result = Benchmark.measure { File.readlines(file) }

puts result

# Выводится: 0.350000 0.070000 0.420000 ( 0.418825)

Этот метод выводит следующую информацию:

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Программирование на языке Ruby»

Представляем Вашему вниманию похожие книги на «Программирование на языке Ruby» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Программирование на языке Ruby»

Обсуждение, отзывы о книге «Программирование на языке Ruby» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x