From WikiChip
Editing mirc/optimization
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.
The edit can be undone.
Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
This page supports semantic in-text annotations (e.g. "[[Is specified as::World Heritage Site]]") to build structured and queryable content provided by Semantic MediaWiki. For a comprehensive description on how to use annotations or the #ask parser function, please have a look at the getting started, in-text annotation, or inline queries help pages.
Latest revision | Your text | ||
Line 3: | Line 3: | ||
mIRC Script Language is an interpreted language - which means that mIRC has to work out what each statement means each and every time it is executed. Consequently it is not considered a fast language and, more often than not, the easiest implementation is not the fastest. | mIRC Script Language is an interpreted language - which means that mIRC has to work out what each statement means each and every time it is executed. Consequently it is not considered a fast language and, more often than not, the easiest implementation is not the fastest. | ||
− | That said, PCs today are far more powerful | + | That said, PCs today are far more powerful then when mIRC first introduced its scripting language, and unless your script is processing large number of messages or large files, then performance is less of an issue than it used to be. On the other hand, the maintainability of your script is also important, so eliminating duplicate code using common aliases & identifiers is also beneficial even if it introduces some minor overheads. |
The following tips will help to increase the execution speed of a script. Most will have a very marginal speed advantage and may not be worth consideration outside of long-running script blocks such as loops. | The following tips will help to increase the execution speed of a script. Most will have a very marginal speed advantage and may not be worth consideration outside of long-running script blocks such as loops. | ||
Line 11: | Line 11: | ||
=== Use {{mIRC|Token Manipulation}} to break strings into pieces === | === Use {{mIRC|Token Manipulation}} to break strings into pieces === | ||
− | If you want to get the first part of a string up to (say) the first full-stop, don't use {{mirc|$pos}} to find the position of this character, and then use {{mirc|$left}} or {{mirc|$right}} to get the relevant sub-string. Instead use mIRCs {{mIRC|Token Manipulation}} functionality: | + | If you want to get the first part of a string up to (say) the first full-stop, don't use {{mirc|$pos}} to find the position of this character, and then use {{mirc|$left}} or {{mirc|$right}} to get the relevant sub-string. Instead use mIRCs {{mIRC|Token Manipulation}} functionality: $gettok(%string,1,$asc(.)) to get the first sentence (less the period itself) and $gettok(%string,2-,$asc(.)) to get the remainder of the paragraph. |
− | |||
− | |||
− | |||
=== Use {{mirc|wildcard|Wildcard-Matching}} === | === Use {{mirc|wildcard|Wildcard-Matching}} === | ||
{{mirc|wildcard|Wildcard-matching}} allows you to see if your string matches a wildcard template containing fixed text and wildcard-match characters ?, * and &. | {{mirc|wildcard|Wildcard-matching}} allows you to see if your string matches a wildcard template containing fixed text and wildcard-match characters ?, * and &. | ||
− | + | "?" match any character<br /> | |
− | + | "*" match 0 or more characters<br /> | |
− | + | " & " match any word | |
So if you want to see if a string contains the word "fat" then you can use: | So if you want to see if a string contains the word "fat" then you can use: | ||
<source lang="mIRC">if (* fat * isin %string) echo -a I am not fat!!</source> | <source lang="mIRC">if (* fat * isin %string) echo -a I am not fat!!</source> | ||
− | Wildcard-matches can be used in {{mirc|/if}} statements, but also in {{mirc|$wildtok|token manipulation}}, {{mirc|$hfind|hash tables}}, {{mirc|$fline|custom windows}}, {{mIRC|on events|ON events}}, {{mirc|$var|variables}}, etc. etc. Even if you cannot narrow it down to a single item, using wildcard-matches to reduce substantially the number of iterations of a loop is very beneficial. | + | Wildcard-matches can be used in {{mirc|/if}} statements, but also in {{mirc|$wildtok|token manipulation}}, {{mirc|$hfind|hash tables}}, {{mirc|$fline|custom windows}}, {{mIRC|on events|ON events}}, {{mirc|$var|variables}}, etc. etc. Even if you cannot narrow it down to a single item, using wildcard-matches to reduce substantially the number of iterations of a loop is also very beneficial. |
So for example, if we want to find a particular line in a custom window, rather than: | So for example, if we want to find a particular line in a custom window, rather than: | ||
Line 60: | Line 57: | ||
=== Alias Bypassing === | === Alias Bypassing === | ||
− | When calling any command | + | When calling any form of command or identifier mIRC will attempt to find a scripted version prior to looking for a native equivalent. This functionality can be bypassed by prefixing commands with <code>!</code> and by inserting a <code>~</code> after the <code>$</code> of identifiers. |
+ | |||
+ | This bypasses mIRC looking for a scripted <code>echo</code> alias: | ||
+ | <syntaxhighlight lang="mirc">!echo -a example1 | ||
+ | .!echo -a example2</syntaxhighlight> | ||
− | + | This bypasses mIRC looking for a scripted <code>me</code> alias<sup>1</sup>: | |
− | <syntaxhighlight lang="mirc"> | + | <syntaxhighlight lang="mirc">echo -a $~me</syntaxhighlight> |
− | + | <sup>1</sup>: Even though mIRC will use its own native identifiers over custom aliases of the same name, there is still some pre-evaluation that can be bypassed using the above method. | |
− | < | ||
=== Conditions === | === Conditions === | ||
Line 75: | Line 75: | ||
if (condition) { command }</syntaxhighlight> | if (condition) { command }</syntaxhighlight> | ||
− | |||
− | |||
=== {{mirc|/if}} vs. {{mirc|$iif}}() === | === {{mirc|/if}} vs. {{mirc|$iif}}() === | ||
Line 82: | Line 80: | ||
Best to worst: | Best to worst: | ||
+ | <syntaxhighlight lang="mirc">var %result = condition_false_value | ||
+ | if (condition) var %result = condition_true_value</syntaxhighlight> | ||
<syntaxhighlight lang="mirc">if (condition) var %result = condition_true_value | <syntaxhighlight lang="mirc">if (condition) var %result = condition_true_value | ||
else var %result = condition_false_value</syntaxhighlight> | else var %result = condition_false_value</syntaxhighlight> | ||
− | |||
− | |||
<syntaxhighlight lang="mirc">var %result = $iif(condition, condition_true_value, condition_false_value)</syntaxhighlight> | <syntaxhighlight lang="mirc">var %result = $iif(condition, condition_true_value, condition_false_value)</syntaxhighlight> | ||
− | + | === {{mirc|/tokenize}} & $n vs {{mirc|$gettok}}() === | |
− | + | For successive<sup>1</sup> calls against the same data, it is faster to use <code>/tokenize</code> and <code>$n</code> over <code>$gettok()</code>. | |
− | |||
− | === {{mirc|/tokenize}} & $n vs | ||
− | For successive<sup> | ||
<syntaxhighlight lang="mirc">;; faster than using $gettok(a b c, 1, 32) $gettok(a b c, 2, 32) | <syntaxhighlight lang="mirc">;; faster than using $gettok(a b c, 1, 32) $gettok(a b c, 2, 32) | ||
tokenize 32 a b c | tokenize 32 a b c | ||
echo -a $1 $2</syntaxhighlight> | echo -a $1 $2</syntaxhighlight> | ||
− | <sup> | + | <sup>1</sup>: even with just two references against the same input tokenizing is faster than using $gettok |
− | === [ ] vs | + | === []'s vs $() vs $eval === |
Best to worst: | Best to worst: | ||
<syntaxhighlight lang="mirc"> | <syntaxhighlight lang="mirc"> | ||
Line 106: | Line 101: | ||
$eval(eval_statement, 2)</syntaxhighlight> | $eval(eval_statement, 2)</syntaxhighlight> | ||
− | '' | + | '''Note:''' "$($+(%,var,%i))" is, however, far more readable than "[ % [ $+ [ var [ $+ [ %i ] ] ] ] ]". |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | === /var vs /set === | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | multiple /set -l to set local variables is much faster than /var because /var has to parse the line and call /set for each variable anyway. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
[[Category:mIRC|optimization]] | [[Category:mIRC|optimization]] |