Скорее наоборот — для .NET это обкатанное надёжное решение, которое ещё и обновляется отдельно. Ну и принципиально CE ближе к взрослому серверу, чем SQL Lite.
Вы имеете в виду что SQLite «в коробке» это однопользовательская БД и этим все сказано? Правильно ли я понял чем «взрослый» сервер отличается молодого? А нужно ли оно на мобильном девайсе?
Код SQLite один из самых вылизанных. Смысла в портировании не вижу вообще. То есть один смысл есть — работа в условиях, где нельзя использовать неуправлемый код, например ASP.Net хостинг. с другой сторны, на хостинге будет MS SQL Server. Так что практического смысла в портированиинет. Впрочем, сам авторор пишет
Q: Since SQLite has a windows dll and an executable you can download why port to C#?
этот порт нужен в первую очередь для внедрения в silverlight-приложения для организации внутренней базы данных с доступом чрез sql-запросы. это очень важно и нужно для silverlight-разработчиков.
А можно узнать причину?
Разве скрипт пользователя хостинга X не будет работать от пользователя системы X?
На никсовых то разрешены ssh, system-функции(кроме «совсем уж шаред») и т.д.
смысл в том чтобы не парится по поводу архитектуры под которой будет запущено это дело.
а думать, что же положить в дистрибутив, x86 или x64 версию — не каждому хочется.
А как отказ от PInvoke убыстрит код?
Думаете, что родное C# API быстрее, чем вызов WinAPI через PInvoke?
Мне кажется, что должно быть плюс-минус полпроцента.
Или я чего-то не понимаю?
Сам механизм P/Invoke не очень шустрый, ибо состоит из преобразования managed переменных в unmanaged параметры, обратной операции и всякой побочной возни.
В родном, это в том, который внутренний в .NET и вызывает нативные методы? Там количество этой возни сильно уменьшено за счёт хитрых структур, специальных оптимизаций, небезопасных методов. Поскольку это встроено в ядро .NET, они это могут позволить.
Понятно, спасибо.
Хотя (залез в багтракалку) если отказываешься от P/Invoke для вызова FormatMessageA, то это выигрыш. А если для вызова LockFileEx, то, имхо, никакого.
Это особенности работы p/invoke.
Тормоза при переключении между managed и unmanaged кодом (маршализация и пр.) может сожрать всё преимущество в скорости C кода.
[DllImport( «kernel32», SetLastError = true )]
static extern int LockFile(int hFile, int dwFileOffsetLow, int
dwFileOffsetHigh, int nNumberOfBytesToLockLow, int nNumberOfBytesToLockHigh);
Вот чего-то мне кажется что маршализация ничего не стоит.
Пример конкретной штуки которая конкретно в этом приложении C#-Sqlite сделана на P/Invoke. Мне кажется, что маршализация тут не стоит ничего.
С ссылочки цитирую из комментариев «Unfortunately, that extreme precision means a cost of roughly 2.5 seconds per run. Removing the timing code removed that time constraint.»
очень ждем
автор, кстати, говорил, что производительностью вообще не занимался, его интересовал только сам построчный порт с языка Си.
кстати, стоит тут дополнить про название, так как SQLite — это торговая марка, то с названием были по началу проблемы, но потом автор SQLite согласился на название C#-SQLite
Это всё понятно. Но, тем не менее, сравнивать файл .NEТ и нативный и говорить, — «ух, ты! какой маленький!» крайне не корректно. Иначе в пределе получаем некий абстрактный язык программирования в котором sqlite занимает один байт, при размере среды выполнения — сто мегабайт. Можно даже до одного бита ужать: 1 — есть sqlite, 0 — нет sqlite :)
угу, тогда я сейчас начну страшным голосом кричать какие мальенкие программы получаются на MSVC++ 150 К на программу с гуями! Ну, и ещё пять метров билиотек…
В том-то и приккол — что надо с собой таскать. Т.к. они могут быть в системе. Могут не быть. Могут быть, но другой версии. В результате установленнео приложение занимает не много места, но вот инсталлятор должен содеражть все необходимые библотеки — иначе запросто может оказаться (и часто оказывается), что у пользователя чего-то не хвататет в системе.
Сравнивать некорректно, это да. Но совершенно по другой причине, не из-за рамера платформы .NET (может для полного счастья еще и размер винды прибавим тогда?).
Некорректно сравнивать потому, что CLR-код, и x86/x64-код — это абсолютно разные величины. И сравнение 528KB и 506KB — это вовсе не показатель. И, кстати, зачастую x86-приложения, портированные на .NET, получаются меньше.
SQLite портирован на .NET