Mam ten fragment kodu:RyuJIT C# zły wynik suma z/zoptymalizować
private void AnswerToCe(int currentBlock, int totalBlock = 0)
{
byte[] bufferToSend;
byte[] macDst = mac;
byte[] macSrc = ConnectionManager.SInstance.GetMyMAC();
byte[] ethType;
byte[] header;
if (Function == FlashFunction.UPLOAD_APPL || Function == FlashFunction.UPLOAD_BITSTREAM)
{
ethType = BitConverter.GetBytes((ushort)EthType.ETH_TYPE_UPLOAD);
ethType = new byte[] { ethType[1], ethType[0] };
header = Header.GetBytes((ushort)binaryBlocks.Count, (ushort)(currentBlock + 1), (ushort)binaryBlocks[currentBlock].Length);
int index = 0;
bufferToSend = new byte[macDst.Length + macSrc.Length + ethType.Length + header.Length + binaryBlocks[currentBlock].Length];
Array.Copy(macDst, 0, bufferToSend, index, macDst.Length);
index += macDst.Length;
Array.Copy(macSrc, 0, bufferToSend, index, macSrc.Length);
index += macSrc.Length;
Logger.SInstance.Write(index.ToString(), "test index pre");
Array.Copy(ethType, 0, bufferToSend, index, ethType.Length);
index += ethType.Length;
Logger.SInstance.Write(index.ToString(), "test index post");
Array.Copy(header, 0, bufferToSend, index, header.Length);
index += header.Length;
Array.Copy(binaryBlocks[currentBlock], 0, bufferToSend, index, binaryBlocks[currentBlock].Length);
}
Jeśli buduję mój wniosek w trybie debugowania wszystko jest ok, test index pre
drukuje 12 i 14. test index post
drukuje to samo w wydaniu tryb z Optimize code
niezaznaczony. jeśli przetestuję z Optimize code
sprawdziłem test index post
drukuje 18 zamiast 14.
Ten sam wynik, jeśli zmienię index += ethType.Length;
na index += 2;
. wygląda na to, że działa tylko index++;index++;
.
Próbowałem tego kodu w pustej aplikacji i sumy są w porządku.
Aplikacja jest wielowątkowa, ale tutaj nie ma współbieżności.
Dekompilowany kod z biblioteki DLL wydaje się być w porządku.
Jakieś pomysły, dlaczego tak się dzieje?
EDYCJA: Zdarza się tylko, gdy aplikacja jest kompilowana dla x64. x86 jest w porządku.
EDIT 3: niektóre informacje kompilacji env:
Visual Studio 15.0.0-RTW + 26228,4
framework 4.7.02053
może wywołać tę kwestię na ramach 4.6.2 i 4.7. inne frameworki nie są testowane.
EDYCJA 5: new, smaller example project. nie są potrzebne żadne zależności.
EDYCJA 6: demontaż projektu testowego here. (zbyt długo, aby opublikować go tutaj)
"Aplikacja jest wielowątkowa, ale tutaj nie ma współbieżności." Trudno powiedzieć, ponieważ jest to tylko część twojego kodu i używa niektórych zmiennych spoza tej funkcji. –
https://msdn.microsoft.com/en-us/library/c151dt3s.aspx – StefanE
@ Punkty przerwania PawełŁukasik trafiają tylko raz. zmienna indeksowa nie jest zewnętrzna. – rmbq