Как насчет некоторого простого тестирования? Используемый код ниже:
long start = System.currentTimeMillis();
String a = "a";
String b = "b";
for (int i = 0; i < 10000000; i++) { //ten million times
String c = a.concat(b);
}
long end = System.currentTimeMillis();
System.out.println(end - start);
"a + b"
версия, выполняемая в [1 113] 2 500 мс . a.concat(b)
выполняемый в [1 114] 1 200 мс . Тестируемый несколько раз. concat()
выполнение версии заняло половину времени в среднем.
Этот результат удивил меня, потому что concat()
метод всегда создает новую строку (это возвращается" new String(result)
". Известно что:
String a = new String("a") // more than 20 times slower than String a = "a"
, Почему компилятор не был способен к, оптимизируют строковое создание в "+ b" код, зная, что это всегда приводило к той же строке? Это могло избежать нового строкового создания. Если Вы не верите оператору выше, протестируйте на Ваш сам.
group_by - отличный метод:
контроллер:
def archive
#this will return a hash in which the month names are the keys,
#and the values are arrays of the posts belonging to such months
#something like:
#{ "February" => [#<Post 0xb5c836a0>,#<Post 0xb5443a0>],
# 'March' => [#<Post 0x43443a0>] }
@posts_by_month = Posts.find(:all).group_by { |post| post.created_at.strftime("%B") }
end
шаблон представления:
<% @posts_by_month.each do |monthname, posts| %>
<%= monthname %>
<ul>
<% posts.each do |post| %>
<li><%= post.title %></li>
<% end %>
</ul>
<% end %>