2 回答
TA贡献1880条经验 获得超4个赞
就像我说的,我可能会先做一些更简单的事情,除非或直到证明它表现不佳。正如 Adi 在他们的回答中所说,这项工作似乎受 I/O 限制 - 因此为其创建多个任务似乎没有什么好处。
publiv void PerformDecode(string sourcePath, string targetPath)
{
File.WriteAllLines(targetPath,File.ReadLines(sourcePath).Select(line=>{
short decodeCounter = 0;
StringBuilder builder = new StringBuilder();
foreach (var singleChar in line)
{
var positionInDecodeKey = decodingKeysList[decodeCounter].IndexOf(singleChar);
if (positionInDecodeKey > 0)
builder.Append(model.Substring(positionInDecodeKey, 1));
else
builder.Append(singleChar);
if (decodeCounter > 18)
decodeCounter = 0;
else ++decodeCounter;
}
return builder.ToString();
}));
}
现在,当然,这段代码在完成之前实际上是阻塞的,这就是我没有标记它的原因async。但是,你的也是如此,它应该已经警告过这一点。
(您可以尝试对Select部分使用 PLINQ 而不是 LINQ,但老实说,我们在这里所做的处理量看起来微不足道;在应用任何此类更改之前先进行分析)
TA贡献1818条经验 获得超7个赞
由于您所做的工作主要是 IO 绑定,因此您并没有真正从并行化中获得任何好处。在我看来(如果我错了,请纠正我)您的转换算法不依赖于您逐行阅读文件,因此我建议改为执行以下操作:
void Main()
{
//Setup streams for testing
using(var inputStream = new MemoryStream())
using(var outputStream = new MemoryStream())
using (var inputWriter = new StreamWriter(inputStream))
using (var outputReader = new StreamReader(outputStream))
{
//Write test string and rewind stream
inputWriter.Write("abcdefghijklmnop");
inputWriter.Flush();
inputStream.Seek(0, SeekOrigin.Begin);
var inputBuffer = new byte[5];
var outputBuffer = new byte[5];
int inputLength;
while ((inputLength = inputStream.Read(inputBuffer, 0, inputBuffer.Length)) > 0)
{
for (var i = 0; i < inputLength; i++)
{
//transform each character
outputBuffer[i] = ++inputBuffer[i];
}
//Write to output
outputStream.Write(outputBuffer, 0, inputLength);
}
//Read for testing
outputStream.Seek(0, SeekOrigin.Begin);
var output = outputReader.ReadToEnd();
Console.WriteLine(output);
//Outputs: "bcdefghijklmnopq"
}
}
显然,您将使用 FileStreams 而不是 MemoryStreams,并且您可以将缓冲区长度增加到更大的值(因为这只是一个演示示例)。此外,由于您的原始方法是 Async,因此您可以使用 Stream.Write 和 Stream.Read 的异步变体
- 2 回答
- 0 关注
- 206 浏览
添加回答
举报