diff для .net 2.0 -> .net 4.0 считается около минуты.
Можно было бы еще больше ускорить. Но одна из тормозных вещей - попытка загрузить как сборку .dll файл не являющийся сборкой. Как подсказал мне добрый профайлер от Eqatec, на эту фигню тратится 20% времени.
Размер файла диффа - 70М, поэтому в релизе сейчас выводятся только названия измененных методов.
Как оказалось в Cecil.Decompiler чуть более чем дофига NotImplementedException. Поэтому пока сравниваются и отображаются только байткоды.
Как еще оказалось, в .Net нет метода, который по .dll файлу скажет, сборка ли это или просто бинарник. Только исключениями BadImageException.
Lessons re-learned
- Ленивость хорошо, круто, красиво, но абсолютно недебагабельно, и непрофилируемо.Поэтому скорее всего вместо yield return будет стоять жесткий return, а для асинхронности будут генирироваться события. Пичалька на самом деле. Хотелось к IEnumerable результатам сравнения прикрутить Rx Framework в гуй слое.
- Dictionary<T1,T2> имеет очень тормозной метод ContainsKey(). Замена его на try catch{} ускоряет ощутимо. Хотя казалось бы...
Дальнейшие теловдижения/апдейты
- Улучшить сравнение методов. Сейчас сравнение идет по Method.FullName. Но в Mono.Cecil метод, имеющий сигнатуру int dummy(int x) и метод int dummy<T>(int x) имеют одинаковое имя. Вопрос зачем объявлять Generic тип, который не используется в сигнатуре вопрос открытый, но в .Net framework таковые имеются.
- Добавить ключей к командной строке. Выводить/не выводить метод, делать ли попытки декомпиляции метода, рассматривать ли вероятность переименованных сборок и т.п.
- Добавить вывод в .html файло с простейшими jquery bells & whistels.
- Добавить рекурсивный разбор папок.
А вот интересно, если взять да и написать такую же штуку да на чистом Хаскеле. Разобрать PE файлик труда особого не составит. Из метаданных вытянуть названия методов скорее всего тоже.
[bredegenerator = off]
Немного результатов. Сколько методов изменилось при переходе от .net 2.0 к .net 4.0. Не учитываются добавленные/удаленные методы, только те, у которых поменялась реализация.
System.Windows.Forms.dll
System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561
934e089
Classes: 2257, Methods : 27965
System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561
934e089
Classes: 2268, Methods : 28151
Different methods : 700
System.Web.dll
System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Classes: 1954, Methods : 23661
System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Classes: 2119, Methods : 24681
Different methods : 1376
System.dll
System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Classes: 1988, Methods : 15498
System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Classes: 2115, Methods : 16480
Different methods : 1584
CommonLanguageRuntimeLibrary
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Classes: 2344, Methods : 21474
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Classes: 2781, Methods : 25089
Different methods : 3410
Немає коментарів:
Дописати коментар