Skip to content

Commit e12fc76

Browse files
committed
TPL/Threading optimizations
1 parent 188885d commit e12fc76

File tree

3 files changed

+87
-34
lines changed

3 files changed

+87
-34
lines changed

SmartImage.Lib/Engines/Impl/IqdbEngine.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ private static ImageResult ParseResult(IHtmlCollection<IElement> tr)
120120

121121
private async Task<IDocument> GetDocument(ImageQuery query)
122122
{
123-
const int MAX_FILE_SIZE = 8388608;
123+
const int MAX_FILE_SIZE = 0x800000;
124124

125125
var response = await EndpointUrl.PostMultipartAsync(m =>
126126
{

SmartImage.Lib/Utilities/ImageHelper.cs

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,13 @@
77
using System.Linq;
88
using System.Net;
99
using System.Net.Http;
10-
using System.Net.Http.Headers;
1110
using System.Threading;
1211
using System.Threading.Tasks;
1312
using AngleSharp.Html.Dom;
1413
using AngleSharp.Html.Parser;
1514
using JetBrains.Annotations;
1615
using Kantan.Net;
1716
using Novus.OS;
18-
using Novus.OS.Win32;
1917
using static Kantan.Diagnostics.LogCategories;
2018

2119
#pragma warning disable CS0168
@@ -74,7 +72,7 @@ public static async Task<List<DirectImage>> ScanForImages(string url, int count
7472

7573
IHtmlDocument document = null;
7674

77-
var c =c2?? CancellationToken.None;
75+
var c = c2 ?? CancellationToken.None;
7876

7977
try {
8078
var client = new HttpClient();
@@ -111,14 +109,14 @@ public static async Task<List<DirectImage>> ScanForImages(string url, int count
111109
}).Distinct().ToList();
112110

113111

114-
var tasks = new List<Task<DirectImage>>();
112+
// var tasks = new List<Task<DirectImage>>();
115113

116114
string hostComponent = UriUtilities.GetHostComponent(new Uri(url));
117115

118116
switch (hostComponent) {
119117
case "www.deviantart.com":
120118
//https://images-wixmp-
121-
urls = urls.Where(x => x.StartsWith("https://images-wixmp"))
119+
urls = urls.Where(x => x.StartsWith("http://images-wixmp") || x.StartsWith("https://images-wixmp"))
122120
.ToList();
123121
break;
124122
case "twitter.com":
@@ -128,7 +126,7 @@ public static async Task<List<DirectImage>> ScanForImages(string url, int count
128126
}
129127

130128

131-
for (int i = 0; i < urls.Count; i++) {
129+
/*for (int i = 0; i < urls.Count; i++) {
132130
int iCopy = i;
133131
134132
tasks.Add(Task.Run(() =>
@@ -144,9 +142,33 @@ public static async Task<List<DirectImage>> ScanForImages(string url, int count
144142
return null;
145143
146144
}, c));
147-
}
145+
}*/
146+
var pr = Parallel.For(0, urls.Count, (i, pls) =>
147+
{
148+
string s = urls[i];
149+
150+
if (IsImage(s, (int) timeoutMS, out var di, c)) {
151+
// return di;
152+
if (di is { } && count > 0) {
153+
images.Add(di);
154+
count--;
155+
pls.Break();
156+
157+
}
158+
else {
159+
di?.Dispose();
160+
}
161+
162+
}
163+
else {
164+
di?.Dispose();
165+
166+
}
148167

149-
while (tasks.Any() && count != 0) {
168+
// return null;
169+
});
170+
171+
/*while (tasks.Any() && count != 0) {
150172
var task = await Task.WhenAny(tasks);
151173
tasks.Remove(task);
152174
@@ -160,7 +182,7 @@ public static async Task<List<DirectImage>> ScanForImages(string url, int count
160182
else {
161183
result?.Dispose();
162184
}
163-
}
185+
}*/
164186

165187
document.Dispose();
166188

@@ -171,16 +193,15 @@ public static bool IsImage(string url, out DirectImage di, CancellationToken? c
171193
=> IsImage(url, TimeoutMS, out di, c);
172194

173195

174-
public static bool IsImage(string url, long timeout, out DirectImage di, CancellationToken? c = null)
196+
public static bool IsImage(string url, int timeout, out DirectImage di, CancellationToken? c = null)
175197
{
176198
di = new DirectImage();
177199

178200
if (!UriUtilities.IsUri(url, out Uri u)) {
179201
return false;
180202
}
181203

182-
183-
var response1 = HttpUtilities.GetHttpResponseAsync(url, (int) timeout, HttpMethod.Head, token: c);
204+
var response1 = HttpUtilities.GetHttpResponseAsync(url, timeout, HttpMethod.Head, token: c);
184205
response1.Wait();
185206
var response = response1.Result;
186207

@@ -215,9 +236,13 @@ public static bool IsImage(string url, long timeout, out DirectImage di, Cancell
215236

216237
try {
217238
using var client = new HttpClient();
218-
var task = client.GetStreamAsync(url, c ?? CancellationToken.None);
219-
task.Wait((int) timeout);
220239

240+
// var cts = new CancellationTokenSource((int) timeout);
241+
// cts.CancelAfter((int) timeout);
242+
// client.Timeout = TimeSpan.FromMilliseconds(timeout);
243+
var task = client.GetStreamAsync(url, c ?? CancellationToken.None /*cts.Token*/);
244+
// task.Wait(timeout);
245+
task.Wait();
221246
var stream = task.Result;
222247

223248
var buffer = new byte[256];

Test/Program.cs

Lines changed: 47 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,12 @@
77
using System.Threading.Tasks;
88
using OpenCvSharp;
99
using SmartImage.Lib;
10+
using SmartImage.Lib.Engines.Impl;
11+
using SmartImage.Lib.Searching;
1012
using SmartImage.Lib.Utilities;
13+
using Point = OpenCvSharp.Point;
1114
using Range = System.Range;
15+
using Size = OpenCvSharp.Size;
1216

1317
#pragma warning disable IDE0079
1418
#pragma warning disable CS0168, CS1998
@@ -37,7 +41,31 @@ public static void OnResult(object _, ResultCompletedEventArgs e)
3741
public static async Task Main(string[] args)
3842
{
3943

40-
/*var q = new ImageQuery(@"C:\Users\Deci\Pictures\Test Images\Test6.jpg");
44+
45+
await test4();
46+
47+
}
48+
49+
static async Task test5()
50+
{
51+
var b = ImageHelper.IsImage(@"http://i235.photobucket.com/albums/ee99/jay911_50/anime/bl/omfg.png",
52+
out var di);
53+
54+
Console.WriteLine(b);
55+
}
56+
static async Task test4()
57+
{
58+
var task = await ImageHelper.ScanForImages(
59+
"https://www.deviantart.com/sciamano240/art/Y-shtola-Final-Fantasy-2v-898752157");
60+
61+
foreach (DirectImage v in task) {
62+
Console.WriteLine(v);
63+
}
64+
}
65+
66+
static async Task test3()
67+
{
68+
var q = new ImageQuery(@"C:\Users\Deci\Pictures\Test Images\Test6.jpg");
4169
var engine = new SauceNaoEngine() { };
4270
engine.Authentication = "362e7e82bc8cf7f6025431fbf3006510057298c3";
4371
var task = engine.GetResultAsync(q);
@@ -54,10 +82,13 @@ public static async Task Main(string[] args)
5482

5583
Console.WriteLine(">> {0}", result);
5684
var result2 = await task2;
57-
Console.WriteLine(">> {0}", result2);*/
85+
Console.WriteLine(">> {0}", result2);
86+
}
5887

59-
/*const double C1 = 6.5025, C2 = 58.5225;
60-
/***************************** INITS *********************************#1#
88+
static void test2()
89+
{
90+
const double C1 = 6.5025, C2 = 58.5225;
91+
/***************************** INITS **********************************/
6192
MatType d = MatType.CV_32F;
6293

6394
Mat i1 = new(@"C:\Users\Deci\Pictures\b.jpg"), i2 = new(@"C:\Users\Deci\Pictures\c.jpg");
@@ -67,10 +98,10 @@ public static async Task Main(string[] args)
6798
var p1 = i1.Width * i1.Height;
6899
var p2 = i2.Width * i2.Height;
69100

70-
if (p1> p2) {
101+
if (p1 > p2) {
71102

72103

73-
var x =i1[new Rect(new Point(0,0), i2.Size())];
104+
var x = i1[new Rect(new Point(0, 0), i2.Size())];
74105

75106
//x.SaveImage(@"C:\Users\Deci\Pictures\x.jpg");
76107
//i1 = i1.Resize(i2.Size());
@@ -84,7 +115,7 @@ public static async Task Main(string[] args)
84115
Mat i12 = i1.Mul(i1); // I1^2
85116
Mat i1I2 = i1.Mul(i2); // I1 * I2
86117

87-
/***********************PRELIMINARY COMPUTING *****************************#1#
118+
/***********************PRELIMINARY COMPUTING ******************************/
88119

89120
Mat mu1 = new(), mu2 = new(); //
90121
Cv2.GaussianBlur(i1, mu1, new Size(11, 11), 1.5);
@@ -124,9 +155,13 @@ public static async Task Main(string[] args)
124155
SSIMResult result = new SSIMResult();
125156
result.diff = ssimMap;
126157
result.mssim = mssim;
127-
Console.WriteLine(result.score);*/
158+
Console.WriteLine(result.score);
159+
}
128160

129-
/*Console.WriteLine(ImageHelper.IsImage(@"http://i235.photobucket.com/albums/ee99/jay911_50/anime/bl/omfg.png", out var di));
161+
static void test1()
162+
{
163+
Console.WriteLine(ImageHelper.IsImage(@"http://i235.photobucket.com/albums/ee99/jay911_50/anime/bl/omfg.png",
164+
out var di));
130165

131166
Debugger.Break();
132167
var wc = new WebClient();
@@ -141,17 +176,10 @@ public static async Task Main(string[] args)
141176
var path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
142177
string s = Path.Combine(path, name2 + "-1" + ext);
143178
Console.WriteLine(s);
144-
img2.Save(s);*/
145-
146-
var task = await ImageHelper.ScanForImages("https://www.deviantart.com/sciamano240/art/Y-shtola-Final-Fantasy-2v-898752157");
147-
148-
foreach (DirectImage v in task) {
149-
Console.WriteLine(v);
150-
}
151-
179+
img2.Save(s);
152180
}
153181

154-
/*public class SSIMResult
182+
public class SSIMResult
155183
{
156184
public double score
157185
{
@@ -160,5 +188,5 @@ public double score
160188

161189
public Scalar mssim;
162190
public Mat diff;
163-
}*/
191+
}
164192
}

0 commit comments

Comments
 (0)