Где я могу найти реализацию NFS C#/.NET?

В последующем ответе Вы спросили об относительной производительности этих двух альтернатив:

z1 = dict(x.items() + y.items())
z2 = dict(x, **y)

На моей машине, по крайней мере (довольно обычный x86_64 под управлением Python 2.5.2), альтернатива z2 не только короче и более проста, но также и значительно быстрее. Можно проверить это для себя с помощью timeit модуль, который идет с Python.

Пример 1: идентичные словари, отображающие 20 последовательных целых чисел на себя:

% python -m timeit -s 'x=y=dict((i,i) for i in range(20))' 'z1=dict(x.items() + y.items())'
100000 loops, best of 3: 5.67 usec per loop
% python -m timeit -s 'x=y=dict((i,i) for i in range(20))' 'z2=dict(x, **y)' 
100000 loops, best of 3: 1.53 usec per loop

z2 победы фактором 3,5 или около этого. Различные словари, кажется, приводят к очень отличающимся результатам, но z2 всегда, кажется, выходит вперед. (Если Вы получаете непоследовательные результаты для тот же тест, попытайтесь передать в [1 112] с числом, больше, чем значение по умолчанию 3.)

Пример 2: неперекрывающиеся словари, отображающие 252 коротких строки на целые числа и наоборот:

% python -m timeit -s 'from htmlentitydefs import codepoint2name as x, name2codepoint as y' 'z1=dict(x.items() + y.items())'
1000 loops, best of 3: 260 usec per loop
% python -m timeit -s 'from htmlentitydefs import codepoint2name as x, name2codepoint as y' 'z2=dict(x, **y)'               
10000 loops, best of 3: 26.9 usec per loop

z2 победы приблизительно фактором 10. Это - довольно большая победа в моей книге!

После сравнения тех двух, я задался вопросом, могла ли z1 низкая производительность быть приписана издержкам построения двух списков объекта, которые в свою очередь привели меня задаваться вопросом, могло ли это изменение работать лучше:

from itertools import chain
z3 = dict(chain(x.iteritems(), y.iteritems()))

Несколько быстрых тестов, например,

% python -m timeit -s 'from itertools import chain; from htmlentitydefs import codepoint2name as x, name2codepoint as y' 'z3=dict(chain(x.iteritems(), y.iteritems()))'
10000 loops, best of 3: 66 usec per loop

приводят меня приходить к заключению, что z3 несколько быстрее, чем [1 116], но совсем не с такой скоростью, как [1 117]. Определенно не стоящий всего дополнительного ввода.

Это обсуждение все еще пропускает что-то важное, которое является сравнением производительности этих альтернатив с "очевидным" способом объединить два списка: использование update метод. Чтобы попытаться сохранить вещи в равных условиях с выражениями, ни одно из которых не изменяет x или y, я собираюсь сделать копию x вместо того, чтобы изменить его оперативный, следующим образом:

z0 = dict(x)
z0.update(y)

А типичный результат:

% python -m timeit -s 'from htmlentitydefs import codepoint2name as x, name2codepoint as y' 'z0=dict(x); z0.update(y)'
10000 loops, best of 3: 26.9 usec per loop

, Другими словами, z0 и z2, кажется, имею чрезвычайно идентичную производительность. Вы думаете, что это могло бы быть совпадением? Я не делаю....

На самом деле, я пошел бы, насколько утверждать, что для чистого кода Python невозможно сделать немного лучше, чем это. И если можно сделать значительно лучше в дополнительном модуле C, я предполагаю, что люди Python могли бы хорошо интересоваться слиянием кода (или изменение на подходе) в ядро Python. Использование Python dict в большом количестве мест; оптимизация его операций является грандиозным предприятием.

Вы могли также записать это как [1 136]

z0 = x.copy()
z0.update(y)

, как Tony делает, но (не удивительно) различие в нотации, оказывается, не имеет любой измеримый эффект на производительность. Используйте, какой бы ни выглядит правильным Вам. Конечно, он абсолютно корректен, чтобы указать, что версию с двумя операторами намного легче понять.

5
задан Peter 5 August 2009 в 17:49
поделиться

6 ответов

Предполагая, что вы не рассматриваете это как обучающий опыт, я бы предложил взять реализацию C ++ / C и обернуть ее через C ++ / CLI.

Однако единственное упоминание о клиенте Windows с открытым исходным кодом для NFS 4 - это этот проект при финансовой поддержке MS и университета, который написал эталонную реализацию для многих других ОС

. их заявление о намерениях и предлагает двухлетний проект, извините.

3
ответ дан 14 December 2019 в 08:56
поделиться

Вы можете попробовать перенести сервер Alfresco JLAN на C #. Он написан на Java, но эти два языка очень похожи.

Alfresco JLAN использует виртуальный файл. системный интерфейс, позволяющий подключите свою собственную файловую систему реализация с главным сервером обработка всего сетевого протокола обмен между клиентом и сервер. JLAN также единственный Java реализация Windows CIFS (Общая файловая система Интернета), в в дополнение к поддержке NFS и FTP.

http://www.alfresco.com/products/aifs/

1
ответ дан 14 December 2019 в 08:56
поделиться

Учитывая, что NFS основан на ONC RPC и XDR , я рекомендую использовать реализацию XDR для C #, например RPC.NET .

1
ответ дан 14 December 2019 в 08:56
поделиться

Я рекомендую начать с последней версии стабильный исходный код NFS, а затем запустите его из Cygwin (см. ниже). Затем вы начнете с полнофункционального, хорошо протестированного клиента и сервера NFS, который затем можно настроить по своему усмотрению.

Попробуйте этот сайт: Cygwin NFS Server HOWTO

0
ответ дан 14 December 2019 в 08:56
поделиться

Здравствуйте, вы можете посмотреть на мой проект с открытым исходным кодом http://code.google.com/p/nekodrive. Вы можете использовать непосредственно библиотеку NekoDrive.NFS c#, которая обертывает мою реализацию протокола NFS V2 и V3 (скоро будет V4.1)... Она пока не поддерживает полный протокол, но работает для основных функций просмотра/загрузки/выгрузки...

надеюсь это поможет

2
ответ дан 14 December 2019 в 08:56
поделиться

Вот порт remotetea, который, кажется, работает http://sourceforge.net/projects/remoteanet/

0
ответ дан 14 December 2019 в 08:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: