| Register | FAQ | Calendar | Search | Today's Posts | Mark Forums Read |
|
#11
| |||
| |||
| hi, thanks for the really quick answer... Your solution works, but I can't do p++ because it's fixed. So I must use another pointer like byte* p2 = p; so now I can do p2++;... Actually, I'm looking for a faster way to compute a checksum on a byte array... For now, I'm using the Adler-32 algorithm, but I'm open to advises on a performant checksum algorithm. It will be for an error checking mecanism for tcp and udp communication on a closed network environment. So it doesn't need to be human-modification resistant, it's just to prevent modification due to the noise on the line (if it can happen)... Thanks ThunderMusic "Nicholas Paldino [.NET/C# MVP]" <mvp@spam.guard.caspershouse.com> wrote in message news:uezij7b5HHA.5360@TK2MSFTNGP03.phx.gbl... > ThunderMusic, > > Use unsafe code: > > byte[] bytes = ...; > > unsafe > { > fixed (byte* p = bytes) > { > // Work with pointer here. > } > } > > As a matter of fact, that's the only way to do it, as you need to pin > down the location of the array to prevent the reference from moving > around. > > Is there a reason you need the pointer, or are you just looking for a > faster way to iterate through the array? > > > -- > - Nicholas Paldino [.NET/C# MVP] > - mvp@spam.guard.caspershouse.com > > "ThunderMusic" <NoSpAmdanlatathotmaildotcom@NoSpAm.com> wrote in message > news:%23KkK5zb5HHA.5316@TK2MSFTNGP04.phx.gbl... >> Hi, >> The subject says it all... I want to use a byte[] and use it as byte* so >> I can increment the pointer to iterate through it. >> >> What is the fastest way of doing so in C#? >> >> Thanks >> >> ThunderMusic >> > > |
|
#12
| |||
| |||
| On Thu, 23 Aug 2007 15:36:18 -0400, "ThunderMusic" <NoSpAmdanlatathotmaildotcom@NoSpAm.com> wrote: >Hi, >The subject says it all... I want to use a byte[] and use it as byte* so I >can increment the pointer to iterate through it. > >What is the fastest way of doing so in C#? > I have recently started with C#, converting C++ applications that must communicate with external equipment using protocols with rigidly fixed byte sequences. Initially I was terribly frustrated abandoning my precious pointer manipulation and access to byte arrays. But I developed a bunch of utilities to create managed code byte[] arrays from pieces and extract appropriate values from them and can now avoid all unmanaged code. Look into Encoding.Convert for converting between ASCII byte sequences and Unicode, MemoryStream.Write and ToArray along with BinaryWriter.Write for creating byte[] data and the BitConverter set of methods to extract values from byte[]. I keep telling myself that staying entirely within managed code is worth all that effort, but I am still early in the process. Some old timers here can probably fill you in on much more detail, including the virtues of doing so. |
|
#13
| |||
| |||
| On Thu, 23 Aug 2007 15:36:18 -0400, "ThunderMusic" <NoSpAmdanlatathotmaildotcom@NoSpAm.com> wrote: >Hi, >The subject says it all... I want to use a byte[] and use it as byte* so I >can increment the pointer to iterate through it. > >What is the fastest way of doing so in C#? > I have recently started with C#, converting C++ applications that must communicate with external equipment using protocols with rigidly fixed byte sequences. Initially I was terribly frustrated abandoning my precious pointer manipulation and access to byte arrays. But I developed a bunch of utilities to create managed code byte[] arrays from pieces and extract appropriate values from them and can now avoid all unmanaged code. Look into Encoding.Convert for converting between ASCII byte sequences and Unicode, MemoryStream.Write and ToArray along with BinaryWriter.Write for creating byte[] data and the BitConverter set of methods to extract values from byte[]. I keep telling myself that staying entirely within managed code is worth all that effort, but I am still early in the process. Some old timers here can probably fill you in on much more detail, including the virtues of doing so. |
|
#14
| |||
| |||
| ThunderMusic, If you are looking to tune this algoritm, I would say that the iteration through the bytes is NOT the way to do it. There are probably a bunch of other areas that can be improved upon. -- - Nicholas Paldino [.NET/C# MVP] - mvp@spam.guard.caspershouse.com "ThunderMusic" <NoSpAmdanlatathotmaildotcom@NoSpAm.com> wrote in message news:ukULcEc5HHA.2312@TK2MSFTNGP06.phx.gbl... > hi, > thanks for the really quick answer... Your solution works, but I can't > do p++ because it's fixed. So I must use another pointer like byte* p2 = > p; so now I can do p2++;... > > Actually, I'm looking for a faster way to compute a checksum on a byte > array... For now, I'm using the Adler-32 algorithm, but I'm open to > advises on a performant checksum algorithm. It will be for an error > checking mecanism for tcp and udp communication on a closed network > environment. So it doesn't need to be human-modification resistant, it's > just to prevent modification due to the noise on the line (if it can > happen)... > > Thanks > > ThunderMusic > > "Nicholas Paldino [.NET/C# MVP]" <mvp@spam.guard.caspershouse.com> wrote > in message news:uezij7b5HHA.5360@TK2MSFTNGP03.phx.gbl... >> ThunderMusic, >> >> Use unsafe code: >> >> byte[] bytes = ...; >> >> unsafe >> { >> fixed (byte* p = bytes) >> { >> // Work with pointer here. >> } >> } >> >> As a matter of fact, that's the only way to do it, as you need to pin >> down the location of the array to prevent the reference from moving >> around. >> >> Is there a reason you need the pointer, or are you just looking for a >> faster way to iterate through the array? >> >> >> -- >> - Nicholas Paldino [.NET/C# MVP] >> - mvp@spam.guard.caspershouse.com >> >> "ThunderMusic" <NoSpAmdanlatathotmaildotcom@NoSpAm.com> wrote in message >> news:%23KkK5zb5HHA.5316@TK2MSFTNGP04.phx.gbl... >>> Hi, >>> The subject says it all... I want to use a byte[] and use it as byte* so >>> I can increment the pointer to iterate through it. >>> >>> What is the fastest way of doing so in C#? >>> >>> Thanks >>> >>> ThunderMusic >>> >> >> > > |
|
#15
| |||
| |||
| ThunderMusic, If you are looking to tune this algoritm, I would say that the iteration through the bytes is NOT the way to do it. There are probably a bunch of other areas that can be improved upon. -- - Nicholas Paldino [.NET/C# MVP] - mvp@spam.guard.caspershouse.com "ThunderMusic" <NoSpAmdanlatathotmaildotcom@NoSpAm.com> wrote in message news:ukULcEc5HHA.2312@TK2MSFTNGP06.phx.gbl... > hi, > thanks for the really quick answer... Your solution works, but I can't > do p++ because it's fixed. So I must use another pointer like byte* p2 = > p; so now I can do p2++;... > > Actually, I'm looking for a faster way to compute a checksum on a byte > array... For now, I'm using the Adler-32 algorithm, but I'm open to > advises on a performant checksum algorithm. It will be for an error > checking mecanism for tcp and udp communication on a closed network > environment. So it doesn't need to be human-modification resistant, it's > just to prevent modification due to the noise on the line (if it can > happen)... > > Thanks > > ThunderMusic > > "Nicholas Paldino [.NET/C# MVP]" <mvp@spam.guard.caspershouse.com> wrote > in message news:uezij7b5HHA.5360@TK2MSFTNGP03.phx.gbl... >> ThunderMusic, >> >> Use unsafe code: >> >> byte[] bytes = ...; >> >> unsafe >> { >> fixed (byte* p = bytes) >> { >> // Work with pointer here. >> } >> } >> >> As a matter of fact, that's the only way to do it, as you need to pin >> down the location of the array to prevent the reference from moving >> around. >> >> Is there a reason you need the pointer, or are you just looking for a >> faster way to iterate through the array? >> >> >> -- >> - Nicholas Paldino [.NET/C# MVP] >> - mvp@spam.guard.caspershouse.com >> >> "ThunderMusic" <NoSpAmdanlatathotmaildotcom@NoSpAm.com> wrote in message >> news:%23KkK5zb5HHA.5316@TK2MSFTNGP04.phx.gbl... >>> Hi, >>> The subject says it all... I want to use a byte[] and use it as byte* so >>> I can increment the pointer to iterate through it. >>> >>> What is the fastest way of doing so in C#? >>> >>> Thanks >>> >>> ThunderMusic >>> >> >> > > |
|
#16
| |||
| |||
| On Aug 23, 10:05 pm, "ThunderMusic" <NoSpAmdanlatathotmaildot...@NoSpAm.com> wrote: > on a performant checksum algorithm. It will be for an error checking > mecanism for tcp and udp communication on a closed network environment. So > it doesn't need to be human-modification resistant, it's just to prevent > modification due to the noise on the line (if it can happen)... It can't happen. Now, how's that for optimization? |
|
#17
| |||
| |||
| On Aug 23, 10:05 pm, "ThunderMusic" <NoSpAmdanlatathotmaildot...@NoSpAm.com> wrote: > on a performant checksum algorithm. It will be for an error checking > mecanism for tcp and udp communication on a closed network environment. So > it doesn't need to be human-modification resistant, it's just to prevent > modification due to the noise on the line (if it can happen)... It can't happen. Now, how's that for optimization? |
|
#18
| |||
| |||
| hi, I know it may be overoptimizing, but this part of the code will be called many many many times per seconds, so I'm must make sure it's as optimized as it can be. It's for a checksum mecanism, so each time a message must be sent, it is called to compute the checksum to append to the message and will be computed again when the client receives it so it can verify the validity of the message. Thanks for the comment tought... ThunderMusic "Chris Mullins [MVP]" <cmullins@yahoo.com> wrote in message news:uyDEaDc5HHA.484@TK2MSFTNGP06.phx.gbl... > "ThunderMusic" <NoSpAmdanlatathotmaildotcom@NoSpAm.com> wrote: > >> The subject says it all... I want to use a byte[] and use it as byte* so >> I can increment the pointer to iterate through it. > > I really hate to be pedantic, but I'm willing to bet that the difference > in how you iterate through your array makes little to no difference in the > overall performance of your code. > > People frequently are guilting of over-optimizing things that are already > "Fast Enough". Unless you've verified this section is slow via a Profiler, > you're better off not getting fancy with optimizations. > > -- > Chris Mullins, MCSD.NET, MCPD:Enterprise, Microsoft C# MVP > http://www.coversant.com/blogs/cmullins > |
|
#19
| |||
| |||
| hi, I know it may be overoptimizing, but this part of the code will be called many many many times per seconds, so I'm must make sure it's as optimized as it can be. It's for a checksum mecanism, so each time a message must be sent, it is called to compute the checksum to append to the message and will be computed again when the client receives it so it can verify the validity of the message. Thanks for the comment tought... ThunderMusic "Chris Mullins [MVP]" <cmullins@yahoo.com> wrote in message news:uyDEaDc5HHA.484@TK2MSFTNGP06.phx.gbl... > "ThunderMusic" <NoSpAmdanlatathotmaildotcom@NoSpAm.com> wrote: > >> The subject says it all... I want to use a byte[] and use it as byte* so >> I can increment the pointer to iterate through it. > > I really hate to be pedantic, but I'm willing to bet that the difference > in how you iterate through your array makes little to no difference in the > overall performance of your code. > > People frequently are guilting of over-optimizing things that are already > "Fast Enough". Unless you've verified this section is slow via a Profiler, > you're better off not getting fancy with optimizations. > > -- > Chris Mullins, MCSD.NET, MCPD:Enterprise, Microsoft C# MVP > http://www.coversant.com/blogs/cmullins > |
|
#20
| |||
| |||
| hi, So, here is the code to get my checksum. If you see something that can be optimized, let me know. thanks ThunderMusic Code:
private const UInt16 MOD_ADLER = 65521;
private unsafe uint GetChecksum(byte[] databytes)
{
UInt32 a = 1, b = 0;
fixed (byte* tmpdata = databytes)
{
byte* data = tmpdata;
int len = databytes.Length; /* Length in bytes */
while (len > 0)
{
int tlen = len > 5550 ? 5550 : len;
len -= tlen;
do
{
a += *(data++);
b += a;
} while ((--tlen) > 0);
a = (a & 0xffff) + (a >> 16) * (65536 - MOD_ADLER);
b = (b & 0xffff) + (b >> 16) * (65536 - MOD_ADLER);
}
/* It can be shown that a <= 0x1013a here, so a single subtract will
do. */
if (a >= MOD_ADLER)
a -= MOD_ADLER;
/* It can be shown that b can reach 0xffef1 here. */
b = (b & 0xffff) + (b >> 16) * (65536 - MOD_ADLER);
if (b >= MOD_ADLER)
b -= MOD_ADLER;
}
return ((b << 16) | a);
}
"Nicholas Paldino [.NET/C# MVP]" <mvp@spam.guard.caspershouse.com> wrote in message news:ewAkXGc5HHA.4712@TK2MSFTNGP04.phx.gbl... > ThunderMusic, > > If you are looking to tune this algoritm, I would say that the > iteration through the bytes is NOT the way to do it. There are probably a > bunch of other areas that can be improved upon. > > > -- > - Nicholas Paldino [.NET/C# MVP] > - mvp@spam.guard.caspershouse.com > > "ThunderMusic" <NoSpAmdanlatathotmaildotcom@NoSpAm.com> wrote in message > news:ukULcEc5HHA.2312@TK2MSFTNGP06.phx.gbl... >> hi, >> thanks for the really quick answer... Your solution works, but I can't >> do p++ because it's fixed. So I must use another pointer like byte* p2 = >> p; so now I can do p2++;... >> >> Actually, I'm looking for a faster way to compute a checksum on a byte >> array... For now, I'm using the Adler-32 algorithm, but I'm open to >> advises on a performant checksum algorithm. It will be for an error >> checking mecanism for tcp and udp communication on a closed network >> environment. So it doesn't need to be human-modification resistant, it's >> just to prevent modification due to the noise on the line (if it can >> happen)... >> >> Thanks >> >> ThunderMusic >> >> "Nicholas Paldino [.NET/C# MVP]" <mvp@spam.guard.caspershouse.com> wrote >> in message news:uezij7b5HHA.5360@TK2MSFTNGP03.phx.gbl... >>> ThunderMusic, >>> >>> Use unsafe code: >>> >>> byte[] bytes = ...; >>> >>> unsafe >>> { >>> fixed (byte* p = bytes) >>> { >>> // Work with pointer here. >>> } >>> } >>> >>> As a matter of fact, that's the only way to do it, as you need to pin >>> down the location of the array to prevent the reference from moving >>> around. >>> >>> Is there a reason you need the pointer, or are you just looking for a >>> faster way to iterate through the array? >>> >>> >>> -- >>> - Nicholas Paldino [.NET/C# MVP] >>> - mvp@spam.guard.caspershouse.com >>> >>> "ThunderMusic" <NoSpAmdanlatathotmaildotcom@NoSpAm.com> wrote in message >>> news:%23KkK5zb5HHA.5316@TK2MSFTNGP04.phx.gbl... >>>> Hi, >>>> The subject says it all... I want to use a byte[] and use it as byte* >>>> so I can increment the pointer to iterate through it. >>>> >>>> What is the fastest way of doing so in C#? >>>> >>>> Thanks >>>> >>>> ThunderMusic >>>> >>> >>> >> >> > > |
![]() |
| Thread Tools | |
| Display Modes | |
In an effort to better serve ads to our visitors, cookies are used on objectmix.com. For more information, check out our Privacy Policy.