Оформить заказ:
func convertString(_ input : String) -> String {
let allElements = Array(input)
let uniqueElements = Array(NSOrderedSet(array: allElements)) as! [Character]
var outputString = ""
for uniqueChar in uniqueElements {
var count = 0
for char in allElements {
if char == uniqueChar {
count+=1
}
}
if count > 2 {
outputString += "\(uniqueChar)\(count)"
} else if count == 2 {
outputString += "\(uniqueChar)\(uniqueChar)"
} else {
outputString += "\(uniqueChar)"
}
}
return outputString
}
Вход : convertString("atttbcdddd")
Выход : at3bcd4
[ 115]
blktrace - это то, что вы ищете, информация о блочном уровне, ожидание / блокировка / занятость и т. Д., Очень подробно, есть довольно много пакетов, которые являются производными от нее, seekwatcher, ...
Другой инструмент, подобный тому, что сказал sigjuice, iotop, также удобен, но менее информативен для серьезного анализа. Также я считаю, что btrace / blktrace гораздо лучше подходит для трассировки ввода-вывода, чем oprofile, который является более общим и по сравнению с ним увеличивает нагрузку.
Также посмотрите pidstat -d
. Это позволяет вам увидеть, сколько каждый процесс читает и пишет.
strace покажет вам, сколько времени тратится на системный вызов, но не скажет, сколько из этого времени тратится на ожидание по сравнению с временем, действительно затраченным на ввод-вывод. , вы можете выбрать, какой системный вызов вы хотите отслеживать или какой тип, это довольно мощный
latencytop был бы еще одним хорошим инструментом, потому что ваш процесс может ожидать ввода-вывода из-за других процессов или из-за какой-то демон, ведущий дневник.
top (1) will show this imformation. You can specify an individual pid with -p