Maksymalna długość łańcucha na mojej maszynie to 1 073,741,791 .
Widzisz, ciągi nie są ograniczone liczbą całkowitą, jak się powszechnie uważa.
Pomijając ograniczenia pamięci, ciągi nie mogą mieć więcej niż 2 30 ( 1 073 741 824 ) znaków, ponieważ Microsoft CLR (Common Language Runtime) narzuca ograniczenie 2 GB. 33 więcej niż mój komputer jest dozwolony.
Oto coś, co możesz spróbować samemu.
Utwórz nową aplikację konsoli C # w Visual Studio, a następnie skopiuj / wklej główną metodę tutaj:
static void Main(string[] args)
{
Console.WriteLine("String test, by Nicholas John Joseph Taylor");
Console.WriteLine("\nTheoretically, C# should support a string of int.MaxValue, but we run out of memory before then.");
Console.WriteLine("\nThis is a quickish test to narrow down results to find the max supported length of a string.");
Console.WriteLine("\nThe test starts ...now:\n");
int Length = 0;
string s = "";
int Increment = 1000000000; // We know that s string with the length of 1000000000 causes an out of memory exception.
LoopPoint:
// Make a string appendage the length of the value of Increment
StringBuilder StringAppendage = new StringBuilder();
for (int CharacterPosition = 0; CharacterPosition < Increment; CharacterPosition++)
{
StringAppendage.Append("0");
}
// Repeatedly append string appendage until an out of memory exception is thrown.
try
{
if (Increment > 0)
while (Length < int.MaxValue)
{
Length += Increment;
s += StringAppendage.ToString(); // Append string appendage the length of the value of Increment
Console.WriteLine("s.Length = " + s.Length + " at " + DateTime.Now.ToString("dd/MM/yyyy HH:mm"));
}
}
catch (OutOfMemoryException ex) // Note: Any other exception will crash the program.
{
Console.WriteLine("\n" + ex.Message + " at " + DateTime.Now.ToString("dd/MM/yyyy HH:mm") + ".");
Length -= Increment;
Increment /= 10;
Console.WriteLine("After decimation, the value of Increment is " + Increment + ".");
}
catch (Exception ex2)
{
Console.WriteLine("\n" + ex2.Message + " at " + DateTime.Now.ToString("dd/MM/yyyy HH:mm") + ".");
Console.WriteLine("Press a key to continue...");
Console.ReadKey();
}
if (Increment > 0)
{
goto LoopPoint;
}
Console.WriteLine("Test complete.");
Console.WriteLine("\nThe max length of a string is " + s.Length + ".");
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey();
}
Moje wyniki były następujące:
Test strunowy autorstwa Nicholasa Johna Josepha Taylora
Teoretycznie C # powinien obsługiwać ciąg int.MaxValue, ale wcześniej zabrakło nam pamięci.
Jest to szybki test zawężający wyniki w celu znalezienia maksymalnej obsługiwanej długości łańcucha.
Test rozpoczyna się ... teraz:
s.Length = 1000000000 at 08/05/2019 12:06
Wyjątek typu "System.OutOfMemoryException 'został wyrzucony. o 08.05.2019 12:06. Po zdziesiątkowaniu wartość Przyrostu wynosi 100000000.
Wyjątek typu "System.OutOfMemoryException 'został wyrzucony. o 08.05.2019 12:06. Po zdziesiątkowaniu wartość Przyrostu wynosi 10000000. s.Length = 1010000000 o 08.05.2019 12:06 s. Długość = 1020000000 o 08.05.2019 12:06 s. Długość = 1030000000 o 08.05.2019 12 : 06 s. Długość = 1040000000 o 08.05.2019 12:06 s. Długość = 1050000000 o 08.05.2019 12:06 s. Długość = 1060000000 o 08.05.2019 12:06 s. Długość = 1070000000 o 08.05.2019 12:06
Wyjątek typu "System.OutOfMemoryException 'został wyrzucony. o 08.05.2019 12:06. Po zdziesiątkowaniu wartość Przyrostu wynosi 1000000. s.Length = 1071000000 o 08.05.2019 12:06 s. Długość = 1072000000 o 08.05.2019 12:06 s. Długość = 1073000000 o 08.05.2019 12 : 06
Wyjątek typu "System.OutOfMemoryException 'został wyrzucony. o 08.05.2019 12:06. Po zdziesiątkowaniu wartość Przyrostu wynosi 100000. s.Length = 1073100000 at 08/05/2019 12:06 s.Length = 1073200000 at 08/05/2019 12:06 s.Length = 1073300000 at 08/05/2019 12 : 06 s. Długość = 1073400000 o 08.05.2019 12:06 s. Długość = 1073500000 o 08.05.2019 12:06 s. Długość = 1073600000 o 08.05.2019 12:06 s. Długość = 1073700000 o 08.05.2019 12:06
Wyjątek typu "System.OutOfMemoryException 'został wyrzucony. o 08.05.2019 12:06. Po zdziesiątkowaniu wartość Przyrostu wynosi 10000. s.Length = 1073710000 at 08/05/2019 12:06 s.Length = 1073720000 at 08/05/2019 12:06 s.Length = 1073730000 at 08/05/2019 12 : 06 s. Długość = 1073740000 o 08.05.2019 12:06
Wyjątek typu "System.OutOfMemoryException 'został wyrzucony. o 08.05.2019 12:06. Po zdziesiątkowaniu wartość Przyrostu wynosi 1000. s.Length = 1073741000 at 08/05/2019 12:06
Wyjątek typu "System.OutOfMemoryException 'został wyrzucony. o 08.05.2019 12:06. Po zdziesiątkowaniu wartość Przyrostu wynosi 100. s.Length = 1073741100 at 08/05/2019 12:06 s.Length = 1073741200 at 08/05/2019 12:06 s.Length = 1073741300 at 08/05/2019 12 : 07 s. Długość = 1073741400 o 08.05.2019 12:07 s. Długość = 1073741500 o 08.05.2019 12:07 s. Długość = 1073741600 o 08.05.2019 12:07 s. Długość = 1073741700 o 08.05.2019 12:07
Wyjątek typu "System.OutOfMemoryException 'został wyrzucony. o 08.05.2019 12:07. Po zdziesiątkowaniu wartość Przyrostu wynosi 10. s.Length = 1073741710 o 08.05.2019 12:07 s.Length = 1073741720 o 08.05.2019 12:07 s.Length = 1073741730 o 08.05.2019 12 : 07 s. Długość = 1073741740 o 08.05.2019 12:07 s. Długość = 1073741750 o 08.05.2019 12:07 s. Długość = 1073741760 o 08.05.2019 12:07 s. Długość = 1073741770 o 08.05.2019 12:07 s. Długość = 1073741780 o 08.05.2019 12:07 s. Długość = 1073741790 o 08.05.2019 12:07
Wyjątek typu "System.OutOfMemoryException 'został wyrzucony. o 08.05.2019 12:07. Po zdziesiątkowaniu wartość Przyrostu wynosi 1. s.Length = 1073741791 na 08.05.2019 12:07
Wyjątek typu "System.OutOfMemoryException 'został wyrzucony. o 08.05.2019 12:07. Po zdziesiątkowaniu wartość przyrostu wynosi 0. Test zakończony.
Maksymalna długość łańcucha wynosi 1073741791.
Naciśnij dowolny klawisz, aby kontynuować.
Maksymalna długość łańcucha na mojej maszynie to 1073741791.
Byłbym bardzo wdzięczny, gdyby ludzie mogli opublikować swoje wyniki jako komentarz poniżej.
Ciekawie będzie się dowiedzieć, czy ludzie uzyskają takie same lub różne wyniki.