Использование StringBuilder для сборки строки даст вам увеличение обработки в 600 раз (так как это предотвращает повторное создание объекта каждый раз, когда вы добавляете строку.
перед циклом (инициализация емкости позволяет избежать воссоздания резервного массива вStringBuilder):
StringBuilder sb = new StringBuilder(1000000 * ReadLength);
в цикле:
sb.Append(all.Substring(randomPos, ReadLength) + Environment.NewLine);
после цикла:
readString = sb.ToString();
Использование массива char вместо строки для извлечения значений приводит к другому30% улучшение, поскольку вы избегаете создания объекта при вызове Substring ():
перед циклом:
char[] chars = all.ToCharArray();
в цикле:
sb.Append(chars, randomPos, ReadLength);
sb.AppendLine();
Редактировать (окончательная версия, которая не использует StringBuilder и выполняется за 300 мс):
char[] chars = all.ToCharArray();
var iterations = 1000000;
char[] results = new char[iterations * (ReadLength + 1)];
GetRandomStrings(len, iterations, ReadLength, chars, results, 0);
string s = new string(results);
private static void GetRandomStrings(int len, int iterations, int ReadLength, char[] chars, char[] result, int resultIndex)
{
Random random = new Random();
int i = 0, index = resultIndex;
while (i < iterations && len - 100 > 0) //len is 3000000
{
var i1 = len - ReadLength;
int randomPos = random.Next() % i1;
Array.Copy(chars, randomPos, result, index, ReadLength);
index += ReadLength;
result[index] = Environment.NewLine[0];
index++;
i++;
}
}