String.formatは遅いのか?
ログの出力の際にも、よく使うString.format だが、使いやすいが故に気にせず使っていたところ、String.formatは遅いという噂を聞いたので、どのくらい遅いのか比較してみた。
どうやら、内部でFormatterのインスタンスが毎回生成されているために遅いそうだ。。
gradle initカレントディレクトリに、build.gradleや、gradlew などのファイルが生成される。import groovy.json.*
String json = '''
{
"reward_id_1": 100,
"reward_id_2": 200,
"reward_id_3": 300,
"other1": 10,
"other2": 20,
"other3": 30
}
'''
Map propertyMap(obj, String property) {
property = property.replace("*", ".*")
return obj.keySet()
.findAll({ it ==~ /${property}/ })
.collectEntries([:] as LinkedHashMap, { p -> ["$p": obj."$p"] })
}
def obj = new JsonSlurper().parseText(json)
println obj
// ==> [other1:10, other2:20, other3:30, reward_id_1:100, reward_id_2:200, reward_id_3:300]
println propertyMap(obj, "reward_id_*")
// ==> [reward_id_1:100, reward_id_2:200, reward_id_3:300]
propertyMap(obj, "reward_id_*").each { key, rewardId ->
println rewardId
}
// ==> 100
// ==> 200
// ==> 300
Map propertyMap(obj, String property) {
property = property.replace("*", ".*")
obj.findAll { it ==~ /${property}/ }
}
println obj.findAll { it ==~ /reward_id_.*/ }
// ==> [reward_id_1:100, reward_id_2:200, reward_id_3:300]
class Person{
String name
}
def personList = [ new Person(name:"hoge"),
new Person(name:"piyo") ]
personList.each { println it.name }
// 出力結果
// ==> hoge
// ==> piyo
リスト配列のオブジェクトをeach できるのは当然だが、def person = new Person(name:"foo")
person.each { println it.name }
// 出力結果
// ==> foo
def arr = []
for (int i=0; i<3; i++){
arr << { println i }
}
arr.each { it() }
// 出力結果
// ==> 3
// ==> 3
// ==> 3
クロージャ内の出力関数が実行される時には変数i はすでにインクリメントされたものが出力されるようだ。。for (int i=0; i<3; i++){
arr << { i_ -> println i_ }.curry(i)
}
arr.each { it() }
// 出力結果
// ==> 0
// ==> 1
// ==> 2
dependencies {
compile "org.codehaus.groovy:groovy-all:2.4.7"
compile "org.apache.ant:ant:1.9.7"
compile "commons-cli:commons-cli:1.3.1"
}
@Grab(group='com.dropbox.core', module='dropbox-core-sdk', version='2.1.+')
import com.dropbox.core.*
import com.dropbox.core.v2.*
import java.util.Locale
final String USER_AGENT = "TestApp/1.0"
final String OAUTH2_ACCESS_TOKEN = "XXX"
def config = new DbxRequestConfig(USER_AGENT,Locale.getDefault().toString())
def client = new DbxClientV2(config, OAUTH2_ACCESS_TOKEN)
String accountName =client.users().getCurrentAccount().getName().getDisplayName()
int capacity = client.users().getSpaceUsage().getAllocation().getIndividualValue().getAllocated() / 1024 / 1024
int used = client.users().getSpaceUsage().getUsed() / 1024 / 1024
println "name: ${accountName}"
println "size: ${used}/${capacity} MB"
println "files:"
client.files().listFolder("").getEntries().each {
println it.getName()
}
name: tyabuta size: 1096/3968 MB files: hoge.txt piyo.txt