PowerShellFar — PowerShell host и автоматизация Far Manager

Здесь можно обсудить ваш любимый плагин.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Post by NightRoman »

Latest post of the previous page:

Не вдаваясь в детали (какие еще плагины) все вместе только что загруженное - 30 мегов. Потом может быть больше, потом опять меньше (там же GC механизм освобождения памяти), но где-то так и есть, я за этим иногда поглядываю.

А CPU как именно померять (я не мастак в этом)?
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Post by NightRoman »

Позапускал все скрипты, что есть в наличии, и запустил бесконечный цикл. Память 37 мегов, CPU 50% (показывает process explorer)
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Post by NightRoman »

Хм, забавно, PowerShell.exe только что запущенный - тоже 30 мегов (потом меньше, если не загружать его данными и работой).

А о чем может загрузка процессора говорить? Это ведь с фактической производительностью выполняемого кода может и не связано быть.

Но по любому PowerShell сравнительно медленный (смотря что, конечно), этого у него пока не отнять, увы.
User avatar
t-rex
Страшный и ужасный
Posts: 4910
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Has thanked: 1 time
Been thanked: 8 times
Contact:

Post by t-rex »

NightRoman
Ну если sleep сделать в цикле то думаю что CPU будет отнимать меньше. Но вот памяти мне кажется .NET должен отбирать побольше.
И ещё вопрос, .Net он забирает память сразу при загрузке плагина или только на момент работы скрипта?
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Post by NightRoman »

Мой Far без Far.NET при загрузке весит: 3.4 мега.
С Far.NET и PowerShellFar без опции PluginPreloadable: 12.3 мега, после первой команды PowerShell: те же 30 мегов.
Соответственно, с опцией PluginPreloadable: 30 мегов сразу при загрузке (я так и пользую, чтобы задействовать PowerShell обработчики для событий редактора, например, для авто-очистки концов строк при сохранении некоторых типов файлов).

Все, что загружено из .NET и PowerShell ядра уже не выгружается. Память под работу скриптов, конечно, освобождается, но механизмом GC, то есть это может и не мгновенно по окончании работы скрипта произойти.

А то, что .NET в Far.NET берет "скромно" - это не удивительно - там ведь WinForm основной монстр, а у нас оттуда ничего не задействовано. (но плагинам и даже PowerShell скриптам никто не мешает задействовать - тогда все цифирки будут больше, но я не проверял - пока вроде нелогично WinForm тащить в Far).
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Post by NightRoman »

По поводу перекидывания кода из PowerShellFar скриптов в .NET (на случай если кто надумает, по соображениям производительности, разве что). Есть два пути (как минимум).

Первый путь:

Довольно очевидный - создаем плагин второго уровня для Far.NET, тут пояснять особо нечего - имплементируем класс плагина, добавляем меню и т.п. по откатанной схеме. Имеет смысл применить, если сам PowerShell не планируется активно использовать, а только этот плагин.

Второй путь:

Имеет смысл применить, если PowerShell активно используется все равно (даже при унесении части кода в .NET). Создаем обычную библиотеку классов, зависимую от сборки FarNetIntf.dll (Far.NET интерфейсы) и в ней класс(ы) типа такого (пример на C#):

Code: Select all

using System;
using FarManager;
namespace ClassLibrary1
{
	public class Class1
	{
		IFar _far;

		public Class1(IFar far)
		{
			_far = far;
		}

		public bool HelloWorld(string title)
		{
			return _far.Msg("Hello World", title);
		}
	}
}
Вот и все, что нужно. Осталось вызвать наш оптимизированный переносом в .NET код HelloWorld() из PowerShell кода.

Code: Select all

# грузим библиотеку, можно в профайле, если используем почти всегда
[void][System.Reflection.Assembly]::LoadFrom("<path>\HelloWorld.dll")

# создаем наш класс и передаем туда $Far (эта сборка все-таки для него)
$Hello = New-Object ClassLibrary1.Class1 $Far

# используем, что хотим из паблик членов у нашего Class1
$result = $Hello.HelloWorld("This is example of parameter")
Итак, преимущества такого пути:
*) такая сборка - это не плагин, а значит не нужны накладные расходы по имплементации плагина.
*) грузим сборку только по необходимости: LoadFrom грузит библиотеку только при первом вызове.
*) методы такой сборки доступны всем скриптам, в отличие от кода, унесенного в реальный плагин.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Post by NightRoman »

Путь 2, кстати - и готовый ответ на то, как грузить именно .NET код только по необходимости (вопрос упоминался ранее). Да, этот путь с PowerShell, но код все-таки из .NET. И этот путь куда гибче, чем подход с отдельными плагинами, загружаемыми по требованию, или кусками кода из конфиг файлов или сорсов с динамической компиляцией. Так что, возможно, надстройки, кроме существующей PowerShellFar, уже не нужны, не хочется изобретать то, что и так уже решено. Да, эта надстройка кой-чего стоит (мег 20 сверх, как выяснилось), но по-моему, она точно того стоит. С ее помощью можно не только .NET код вызывать.
mugz
Posts: 181
Joined: Thu 02 Jun, 2005 13:36
Contact:

Post by mugz »

...мне кажется просто несколько неудобным все эти -gt
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Post by NightRoman »

Мне тоже, особенно поначалу с непривычки, тем более что >, использованный по ошибке вместо оператора, гад, так и попытается вывести в файл и может создать файл на диске (в зависимости от того, что справа). Поначалу я плевался тоже, потом привык.

С этим ничего не поделать, кроме расслабиться и получать удовольствие от остального. Посмотрим на это и так для примера: в папке Bench 46 кило кода, где эти операторные чудеса природы встречаются 5+9+3+1 = 18 раз, что составляет 54 байта или 0.0012 часть кода. С этим можно жить.

(В английском языке многие вещи не нравятся, с непривычки или вообще, но его ведь лучше знать и пользоваться, чем наоборот)
mugz
Posts: 181
Joined: Thu 02 Jun, 2005 13:36
Contact:

Post by mugz »

Кстати, а где можно найти хороший туториал по этому делу?
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Post by NightRoman »

Хороших в полном смысле этого слова я не видел пока (то есть занудную спецификацию языка, которую я хотел бы и сам найти). Что могу посоветовать:

*) встроенный хелп, тот, что вызываем из комстроки, набери help или man *, а потом выбирай из списка, например man dir или man dir -d или man dir -full, это по командам, а также man about* (это по языку) и тоже из предложенного списка типа man about_for

*) документы, которые входят в поставку (в меню Programs\Windows PowerShell 1.0)

*) документ "PowerShell User Guide.doc", который входил в поставку предыдущих версий, и который напрасно убрали, там кое-что устарело, но именно язык там лучше описан.

*) ньюс группа microsoft.public.windows.powershell, например, на гугле http://groups.google.com/group/microsof ... pics?tsc=1 (но я предпочитаю ее в Outlook Express) - на самом деле, если изредка, но регулярно туда поглядывать, то это и есть лучший туториал, и вопросы можно задать, атмосфера там в сообществе весьма дружелюбная и конструктивная.

*) куча печатного всего выходит на эту тему, но я не в курсе (типа уже не надо)
User avatar
Wave
Posts: 1887
Joined: Thu 04 Aug, 2005 18:47
Has thanked: 15 times
Been thanked: 26 times

Post by Wave »

Хм, а где взять сам пауэршелл, для ХР русской, но так, чтобы не связываться с майкрософтом? Валидацию пройти требуют.

З.ы. Что фреймворк грядущий нам готовит?
Пользуюсь ФАРом больше 20 лет © собирательный.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Post by NightRoman »

Wave wrote:Хм, а где взять сам пауэршелл, для ХР русской, но так, чтобы не связываться с майкрософтом? Валидацию пройти требуют.
Хм, не подскажу..
Wave wrote:З.ы. Что фреймворк грядущий нам готовит?
Не совсем понял. Что будет в след. версии PowerShellFar?

Если да - то не особо много нового. Будет более продвинутый Expand-PowerShell-.ps1\TabExpansion-.ps1. А так подумываю, что диалоги бы надо в Far.Net потихоньку интерфейсами для .NET накрывать, только со временем пока для этого не очень, если и пойдет, то медленно.

Если нет, поясни вопрос, пожалуйста.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Post by NightRoman »

Наконец-то столкнулся с ощутимой проблемой производительности (но дело может быть и не только в PowerShell, смотри вопрос в конце).

В последней версии 1.1.2 появился Profile-Editor-.ps1, который я у себя реально использую все время (и для пользы, и для тестирования). Там Handle-BeforeSave очищает пустые концы строк перед сохранением. На файле с 40000 строк это занимает несколько минут...

Сначала я попинал используемый Remove-EndSpace-.ps1, да, он был лаконичен, но не оптимален, новый вариант работает в 3 раза быстрее:

Code: Select all

process
{
	$t1 = $_.Text
	$t2 = $t1.TrimEnd()
	if ([object]$t1 -ne [object]$t2) {
		$_.Text = $t2
	}
}
Но это не слишком спасает тормоза на 40000 строк. Поэтому в Handle-BeforeSave я добавил проверку и вопрос (если больше 5000 строк):

Code: Select all

function global:Handle-BeforeSave
{
	# trim line ends
	if ($this.Lines.Count -ge 5000) {
		if ($Far.Msg("Would you like to trim lines before saving?", "$($this.Lines.Count) lines", 'YesNo') -ne 0) {
			return
		}
	}
	$this.Lines | Remove-EndSpace-
}
Непонятка у меня вот с чем: проверено, 5000 строк обрабатываются за секунду или меньше. Казалось бы 40000 строк потребуют всяко не более 8 секунд. Это не так, требуется более минуты. В чем может быть дело? В своем коде (Far.NET) пока подвоха не нахожу...
User avatar
t-rex
Страшный и ужасный
Posts: 4910
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Has thanked: 1 time
Been thanked: 8 times
Contact:

Post by t-rex »

NightRoman
Надо читать енц. Когда обрабатываешь много строк надо делать setpos на каждую строку если хочется скорости. Редактор фара это linked list.
JFK
Posts: 34
Joined: Fri 05 Jan, 2007 06:37

Post by JFK »

По поводу самого PowerShell. Идея, конечно, неплохая, вот только больно запоздалая... От командного процессора требуется, чтобы он стоял везде, т.е. на каждом компьютере. Во-вторых, командный процессор, который требует (и базируется на) надстройку .NET, автоматически обречен на провал. Моё твердое убеждение, безо всяких "имхо". Гораздо проще использовать связку C++ + Perl + PHP, чем устанавливать громоздкие .NET Framework и PowerShell.

И не говорите мне, пожалуйста, что дотнет это стандарт, и его широкое распространение -- дело времени. Прошло уже 5 лет с момента появления фрэймворка, а 99% программ и поныне написаны на старом, добром Visual C++ безо всяких intermediate languages.
Post Reply

Return to “Обсуждение плагинов”