Ускоряем Linq2Sql: Compiled Query & ObjectTrackingEnabled

8 апр. 2010 г. | | |

Когда код компилируется - это хорошо. Когда код работает так , как было задумано, - это еще лучше. Ну, а когда код, к тому же, работает быстро - это вобще здорово. Есть масса способов увеличения скорости работы кода, в этом посте я хочу рассказать о возможности увеличения скорости выполнения запросов Linq2Sql.
Если в приложении есть повторяющиеся запросы или запросы, похожие по структуре, но отличающиеся параметром, можно существенно увеличить производительность, если выделить общий запрос, скомпилировать его один раз в лямбда-выражение и затем выполнять уже скомпилированный запрос раз с различными параметрами.
Для этих целей .NET 3.5 и выше есть класс CompiledQuery. Работа с этим классом не представляет ничего сложного. Для примера возьму кусок кода из своего проекта. Смысл в том, что нужно выбирать из БД список форм, соответствующих проекту, заданному через ID. Для этого у меня создан такой скомпилированный запрос:

private static Func<
MyDataContext, int, IEnumerable<Forms>>fGetFormsByProjectID =
CompiledQuery.Compile<
MyDataContext, int, IEnumerable<Forms>>
((
MyDataContext context, int projectID) => context.Forms.
Where<Forms>(form => form.ProjectID == projectID));

А в вызывается он следующим образом:

IEnumerable<forms> forms = fGetFormsByProjectID(new
MyDataContext(ConnectionPool.Connection), projectID);

Кроме использования скомпилированных запросов для увеличения скорости выполнения запросов к БД можно использовать получение данных в режиме "Только чтение". Для этого перед выполнением запроса установите свойство ObjectTrackingEnabled вашего DataContext-экземпляра в false:

using(MyDataContext context = new MyDataContext(ConnectionPool.Connection))
{
context.ObjectTrackingEnabled = false;
var query = from form in context.Forms where form.StatusID == Status.Completed select form;
}

При использовании данного метода следует помнить, что вызов метода SubmitChanges() в режиме получения данных только для чтения вызовет исключение.
На тему производительности Linq2Sql Rico Mariotty провел серию тестов, результаты которых опубликовал в пяти статьях:
DLinq (Linq to SQL) Performance (Part 1)
DLinq (Linq to SQL) Performance (Part 2)
DLinq (Linq to SQL) Performance (Part 3)
DLinq (Linq to SQL) Performance (Part 4)
DLinq (Linq to SQL) Performance (Part 5)
Еще статьи по теме:
http://msdn.microsoft.com/ru-ru/magazine/ee336024.aspx

Полезные акселераторы Visual Studio

30 мар. 2010 г. | | |

F12 - переходит к объявлению класса, метода, переменной и т.д.
Shift-F12 - найти все ссылки
F2 - рефакторинг "Rename method"
Ctrl-R, Ctrl-M - рефакторинг : извлекает выделенный фрагмент кода в отдельный метод
Ctrl-K, Ctrl-C - комментирует выделенный фрагмент кода
Ctrl-K, Ctrl-U - раскомментировать выделенный закомментированный фрагмент кода
Ctrl-E, Ctrl-D - форматирование кода. Например, при вставке кода с синтаксическими ошибками студия не сможет нормально отформатировать вставленный кусок. После устранения ошибок Ctrl-E, Ctrl-D позволяет автоматически расставить все отступы, пробелы и переводы строк согласно текущим настройкам по форматированию кода (Tools->Options->Text Editor->C#->Formatting).
Ctrl+] - перемещение между скобками, комментариями и другими парными элементами ({}, (), /**/, #region/#endregion, ...). Например, если курсор находится на открывающейся скобке, то Ctrl+] переместит его на соответствующую ей закрывающуюся, и наоборот.
Ctrl+C - копирует выделенный текст :), при отсутствии выделения копирует в буфер обмена текущую строку.
Ctrl+L - удаление текущей строки
Ctrl-M, Ctrl-M - сворачивает/разворачивает регион кода, в котором находится курсор (это может быть метод, namespace, комментарий и т.п.)
Ctrl-M, Ctrl-O - Collapse to Definitions
Ctrl-Shift+Space - вызывает intellisense suggestions window на текущем элементе

Создаем ярлык (Shortcut) приложения на рабочем столе, в пуске на C#

15 мар. 2010 г. | | |

Создать ярлык приложения очень просто. Для этого нам понадобится библиотека Interop.IWshRuntimeLibrary, которую нужно подключить в референсы проекта (в SolutionExplorer выбираем нужный проект, правой кнопкой по References->Add Reference, во вкладке COM находим "Windows Script Host Object Model" и клацаем ОК):

И так, подготовительный этап пройден.
Добавим в проект класс, который будет заниматься созданием ярлыков. У меня он именуется ShortcutManager. Состоять он будет из одного статического метода CreateShortcut:

public class ShortcutManager
{
public static void CreateShortcut(string linkName, string apppath, string iconpath, ShortcutLocation location, string hotkey)
{
object shortPath = null;
// Определяем место, где будет создан ярлык
switch (location)
{
case ShortcutLocation.DESKTOP:
{
shortPath = (object)"Desktop";
}; break;
case ShortcutLocation.START_MENU:
{
shortPath = (object)"StartMenu";
}; break;
case ShortcutLocation.COMMON_DESKTOP:
{
shortPath = (object)"AllUsersDesktop";
}; break;
default: shortPath = (object)"Desktop"; break;
}

WshShell shell = new WshShell();
// Получаем полный адрес ярлыка
string link = Path.Combine(((string)shell.SpecialFolders.Item(ref shortPath)), linkName + @".lnk");
// Создаем объект ярлыка
IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(link);
if (!hotkey.Equals(String.Empty))
{
// Назначаем горячую клавишу
shortcut.Hotkey = hotkey;
}
// Описание ярлыка
shortcut.Description = linkName;

shortcut.IconLocation = iconpath;
//Указываем рабочую папку
shortcut.WorkingDirectory = Path.GetDirectoryName(apppath);
// Указываем путь для программы
shortcut.TargetPath = apppath;
// Вызываем метод Save(), который и создаст ярлык
shortcut.Save();
}
}

ShortcutLocation - это Enum, содержащий возможные варианты размещения ярлыка:

public enum ShortcutLocation
{
DESKTOP,
COMMON_DESKTOP,
START_MENU
}

Для примера ярлык может быть создан на рабочем столе текущего пользователя, на общем рабочем столе и в пуск->программы.
В качестве входных аргументов CreateShortcut должен получить название ярлыка (linkName), полный путь к приложению, для которого создается ярлык (apppath), полный путь к иконке, которая будет установлена на ярлык (iconpath), размещение ярлыка (location), горячая клавиша (сочетание клавиш hotkey).
Пример использования CreateShortcut:

Shortcut.ShortcutManager.CreateShortcut("Sample Shortcut", Application.ExecutablePath, Application.ExecutablePath, ShortcutLocation.DESKTOP, String.Empty);

Полный код примера можно скачать тут.

Закрытие torrents.ru

19 февр. 2010 г. | | |

Делегирование домена крупнейшего российского торрент-трекера было приостановлено по решению прокуратуры, сообщила пресс-служба регистратора доменных имен в зоне .ru "Ру-Центр".

Torrents.ru - крупнейший российкий Bit-Torrent-трекер, ищеющий более чем 4 миллионами активных пользователей и около миллиона торрентов, 18 февраля 2010 года закрыт по требованию прокуратуры.

Администрация трекера отмечает, что не получала никаких уведомлений о прекращении делегирования домена torrents.ru и не знает о причинах такого решения.

Работа домена будет приостановлена до тех пор, пока не закончится разбирательство трекера с правоохранительными органами. В "Ру-Центр" направлен соответствующий запрос, однако, весьма вероятно, что выяснение обстоятельств займет некоторое время, в течение которого адрес torrents.ru будет недоступен.

В настоящее время он перенаправляет на "зеркало" сайта по адресу rutracker.org, где размещено сообщение о сбое и инструкции для работы с новым адресом. На этом домене уже работает форум трекера.

18 февраля, то есть вчера, на стартовой страницы сайта torrents.ru весел совет как теперь всем быть дальше: «Мы вынуждены были в срочном порядке сменить доменное имя на rutracker.org. Технически, это означает что для продолжения обмена информацией вам необходимо сменить адреса трекеров в уже скачанных торрент-файлах с bt.torrents.ru на bt.rutracker.org, (вместо bt может быть bt2, bt3 и bt4) либо скачать эти торрент файлы заново (в них уже будет новый адрес трекера). Все остальные ссылки на форуме будут изменены автоматически, однако возможно вам потребуется заново ввести логин и пароль при входе на форум, чтобы броузер запомнил новый адрес». Сегодня же трекер вобще не доступен :(

Помним, скорбим.


SQLite Vs MS SQL CE

17 февр. 2010 г. | | |

Небольшая сравнительная характеристика двух embedded-бд.

  • + SQLite мальнкий размер БД (пустая база весит несколько килобайт против нескольких сот килобайт ms sql ce)
  • + SQLite - кроссплатформенная бд.
  • - MS SQL CE - лимит файла БД в 4 Гб против 1 Tb у SQLite
  • - MS SQL CE - нет триггеров, представлений (на этом моменте хочется заплакать:( )
  • - MS SQL CE - уступает по скорости SQLite
  • - SQLite - нет типа boolean
  • - SQLite - провайдеры linq to sqlite только платные, бесплатный недопиленный (не позволяет работать с представлениями)
  • + SQLite - опенсорсный проект, MS SQL CE - закрытый исходный код

О безопасноти входных данных

4 февр. 2010 г. | | |


Не забывайте о том, что входные данные - всегда небезопасны. Не доверяйте пользователям, особенно если это касается веб-приложений!
(картинка отсюда http://www.xkcd.ru/327 )