Сравнение различных предложений (а также сравнение в контексте замены одного символа различными размерами и позициями цели).
В этом конкретном случае расщепление по целям и объединение на заменах (в данном случае пустая строка) является самым быстрым, по крайней мере, в 3 раза. В конечном счете производительность отличается в зависимости от количества замен, где находятся замены в источнике, и размера источника. #ymmv
(полные результаты здесь )
| Test | Compare | Elapsed |
|---------------------------|---------|--------------------------------------------------------------------|
| SplitJoin | 1.00x | 29023 ticks elapsed (2.9023 ms) [in 10K reps, 0.00029023 ms per] |
| Replace | 2.77x | 80295 ticks elapsed (8.0295 ms) [in 10K reps, 0.00080295 ms per] |
| RegexCompiled | 5.27x | 152869 ticks elapsed (15.2869 ms) [in 10K reps, 0.00152869 ms per] |
| LinqSplit | 5.43x | 157580 ticks elapsed (15.758 ms) [in 10K reps, 0.0015758 ms per] |
| Regex, Uncompiled | 5.85x | 169667 ticks elapsed (16.9667 ms) [in 10K reps, 0.00169667 ms per] |
| Regex | 6.81x | 197551 ticks elapsed (19.7551 ms) [in 10K reps, 0.00197551 ms per] |
| RegexCompiled Insensitive | 7.33x | 212789 ticks elapsed (21.2789 ms) [in 10K reps, 0.00212789 ms per] |
| Regex Insentive | 7.52x | 218164 ticks elapsed (21.8164 ms) [in 10K reps, 0.00218164 ms per] |
(примечание: Perf
и Vs
являются временными расширениями, которые я написал )
void test(string title, string sample, string target, string replacement) {
var targets = target.ToCharArray();
var tox = "[" + target + "]";
var x = new Regex(tox);
var xc = new Regex(tox, RegexOptions.Compiled);
var xci = new Regex(tox, RegexOptions.Compiled | RegexOptions.IgnoreCase);
// no, don't dump the results
var p = new Perf/**/();
p.Add(string.Join(" ", title, "Replace"), n => targets.Aggregate(sample, (res, curr) => res.Replace(new string(curr, 1), replacement)));
p.Add(string.Join(" ", title, "SplitJoin"), n => String.Join(replacement, sample.Split(targets)));
p.Add(string.Join(" ", title, "LinqSplit"), n => String.Concat(sample.Select(c => targets.Contains(c) ? replacement : new string(c, 1))));
p.Add(string.Join(" ", title, "Regex"), n => Regex.Replace(sample, tox, replacement));
p.Add(string.Join(" ", title, "Regex Insentive"), n => Regex.Replace(sample, tox, replacement, RegexOptions.IgnoreCase));
p.Add(string.Join(" ", title, "Regex, Uncompiled"), n => x.Replace(sample, replacement));
p.Add(string.Join(" ", title, "RegexCompiled"), n => xc.Replace(sample, replacement));
p.Add(string.Join(" ", title, "RegexCompiled Insensitive"), n => xci.Replace(sample, replacement));
var trunc = 40;
var header = sample.Length > trunc ? sample.Substring(0, trunc) + "..." : sample;
p.Vs(header);
}
void Main()
{
// also see https://stackoverflow.com/questions/7411438/remove-characters-from-c-sharp-string
"Control".Perf(n => { var s = "*"; });
var text = "My name @is ,Wan.;'; Wan";
var clean = new[] { '@', ',', '.', ';', '\'' };
test("stackoverflow", text, string.Concat(clean), string.Empty);
var target = "o";
var f = "x";
var replacement = "1";
var fillers = new Dictionary {
{ "short", new String(f[0], 10) },
{ "med", new String(f[0], 300) },
{ "long", new String(f[0], 1000) },
{ "huge", new String(f[0], 10000) }
};
var formats = new Dictionary {
{ "start", "{0}{1}{1}" },
{ "middle", "{1}{0}{1}" },
{ "end", "{1}{1}{0}" }
};
foreach(var filler in fillers)
foreach(var format in formats) {
var title = string.Join("-", filler.Key, format.Key);
var sample = string.Format(format.Value, target, filler.Value);
test(title, sample, target, replacement);
}
}
Вы можете добавить цель, которая запускает программу, с помощью add_custom_target (foobar COMMAND foo --bar DEPENDS foo)
. Вы также можете вызвать сценарий вместо программы, в которой легко установить переменные среды (я использую эту настройку в Win32 для настройки путей в VC). Этот сценарий также может быть шаблоном в VCS, поэтому у каждого разработчика есть собственная версия сценария с фактическими параметрами командной строки.
Я думаю, вы потеряете этого. Xcode хранит все определения проекта в файле с именем Foo.xcodeproj / project.pbxproj. Когда один из разработчиков вашего Mac изменяет флаг или настройку, это записывается в файл project.pbxproj. Когда вы изменяете файл CMakeLists.txt, CMake запускает перестройку project.pbxproj, стирая все изменения, внесенные разработчиком Mac. Xcode не разрабатывался с учетом CMake, и они очень хорошо работают вместе.
Одно из возможных решений (которое не является лучшим для разработчиков Mac) - использовать CMake для генерации файлов сборки. Им нужно будет написать несколько пользовательских команд в Xcode, которые вызывают CMake / Make для сборки исполняемых файлов, но они смогут передавать аргументы в CMake для управления процессом сборки. Исполняемые файлы будут определены отдельно для Xcode, а CMake удалит только файлы Makefile. Это может быть способом сделать всех счастливыми.
ИМХО, разработчики CMake не уделили Xcode должного внимания. Но это ограничение заложено в архитектуре Xcode и будет крепким орешком.
Надеюсь, это поможет,
-dan
Изменить:
У ваших разработчиков Xcode есть некоторые ограниченные возможности использовать «Пользовательские настройки». Я не знаю, как их использовать (я парень emacs / make-типа), но, возможно, они могли бы использовать их для переопределения настроек CMake.