Skip to content

Commit d7789af

Browse files
committed
Use yield return/yield break for performance
Changed public API to use IEnumerable and yield return/yield break so that users do not have to load entire database query results to find matches. This should improve performance of matching. Fixes #19
1 parent 7b11e8e commit d7789af

File tree

3 files changed

+19
-11
lines changed

3 files changed

+19
-11
lines changed

DistillNET/DistillNET/DistillNET.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@
99
<RepositoryUrl>https://github.com/TechnikEmpire/DistillNET</RepositoryUrl>
1010
<Description>DistillNET is a library for matching and filtering HTTP requests URLs using the Adblock Plus Filter format.</Description>
1111
<Copyright>Copyright © 2017 - 2018 Jesse Nicholson</Copyright>
12-
<Version>1.5.1</Version>
12+
<Version>1.6.0</Version>
1313
<Authors>Jesse Nicholson</Authors>
1414
<Company>Technik Empire</Company>
1515
<PackageTags>DistillNET Adblock AdblockPlus Adblock-Plus URL-Filter URL-Filtering Content-Filter Filter</PackageTags>
16-
<PackageReleaseNotes>Rule loading is ~twice as fast as previous version now thanks to prepared statements.</PackageReleaseNotes>
17-
<AssemblyVersion>1.5.1.0</AssemblyVersion>
16+
<PackageReleaseNotes>Changed public API to use IEnumerable and yield return/yield break so that users do not have to load entire database query results to find matches. This should improve performance of matching.</PackageReleaseNotes>
17+
<AssemblyVersion>1.6.0.0</AssemblyVersion>
1818
</PropertyGroup>
1919

2020
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">

DistillNET/DistillNET/DistillNET/FilterDbCollection.cs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,7 @@ public Tuple<int, int> ParseStoreRulesFromStream(Stream rawRulesStream, short ca
424424
/// <returns>
425425
/// A list of all compiled blacklisting URL filters for the given domain.
426426
/// </returns>
427-
public List<UrlFilter> GetFiltersForDomain(string domain = "global")
427+
public IEnumerable<UrlFilter> GetFiltersForDomain(string domain = "global")
428428
{
429429
return GetFiltersForDomain(domain, false);
430430
}
@@ -439,7 +439,7 @@ public List<UrlFilter> GetFiltersForDomain(string domain = "global")
439439
/// <returns>
440440
/// A list of all compiled whitelisting URL filters for the given domain.
441441
/// </returns>
442-
public List<UrlFilter> GetWhitelistFiltersForDomain(string domain = "global")
442+
public IEnumerable<UrlFilter> GetWhitelistFiltersForDomain(string domain = "global")
443443
{
444444
return GetFiltersForDomain(domain, true);
445445
}
@@ -456,14 +456,19 @@ public List<UrlFilter> GetWhitelistFiltersForDomain(string domain = "global")
456456
/// <returns>
457457
/// A list of either all whitelist or all blacklist filters for the given domain.
458458
/// </returns>
459-
private List<UrlFilter> GetFiltersForDomain(string domain, bool isWhitelist)
459+
private IEnumerable<UrlFilter> GetFiltersForDomain(string domain, bool isWhitelist)
460460
{
461461
var cacheKey = new Tuple<string, bool>(domain, isWhitelist);
462462

463463

464464
if (m_cache.TryGetValue(cacheKey, out List<UrlFilter> retVal))
465465
{
466-
return retVal;
466+
foreach (var elm in retVal)
467+
{
468+
yield return elm;
469+
}
470+
471+
yield break;
467472
}
468473

469474
retVal = new List<UrlFilter>();
@@ -505,7 +510,9 @@ private List<UrlFilter> GetFiltersForDomain(string domain, bool isWhitelist)
505510
while(reader.Read())
506511
{
507512
short catId = reader.GetInt16(1);
508-
retVal.Add((UrlFilter)m_ruleParser.ParseAbpFormattedRule(reader.GetString(3), catId));
513+
var newRule = (UrlFilter)m_ruleParser.ParseAbpFormattedRule(reader.GetString(3), catId);
514+
retVal.Add(newRule);
515+
yield return newRule;
509516
}
510517
}
511518
}
@@ -514,7 +521,7 @@ private List<UrlFilter> GetFiltersForDomain(string domain, bool isWhitelist)
514521

515522
m_cache.Set(cacheKey, retVal);
516523

517-
return retVal;
524+
yield break;
518525
}
519526

520527
private List<string> GetAllPossibleSubdomains(string inputDomain)
@@ -532,7 +539,7 @@ private List<string> GetAllPossibleSubdomains(string inputDomain)
532539
return retVal;
533540
}
534541

535-
public List<Filter> GetFiltersForRequest(Uri requestString, string referer = "")
542+
public IEnumerable<Filter> GetFiltersForRequest(Uri requestString, string referer = "")
536543
{
537544
return null;
538545
}

DistillNET/Tests/Program.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using System.Collections.Specialized;
1111
using System.Diagnostics;
1212
using System.IO;
13+
using System.Linq;
1314

1415
namespace DistillNET
1516
{
@@ -127,7 +128,7 @@ private static void Main(string[] args)
127128
sw.Restart();
128129
for(int i = 0; i < 1000; ++i)
129130
{
130-
loadedFilters += filterCollection.GetFiltersForDomain().Count;
131+
loadedFilters += filterCollection.GetFiltersForDomain().Count();
131132
}
132133
sw.Stop();
133134

0 commit comments

Comments
 (0)