473,698 Members | 2,690 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Speed Freaks & Bit Fiddlers: Can you make this go faster?

Can someone show me how to speed this up?

1. Whats the fastest way for Unsafe C#?
2. What the fastest way for Safe C#?

public static Int64 ToInt64(Int32 low, Int32 high)
{
Byte[] lowBytes = BitConverter.Ge tBytes(low);
Byte[] highBytes = BitConverter.Ge tBytes(high);

Byte[] bytes = new Byte[8];

Array.Copy(lowB ytes, 0, bytes, 4, 4);
Array.Copy(high Bytes, 0, bytes, 0, 4);

return BitConverter.To Int64(bytes, 0);
}

Thanks.

Russell Mangel
Las Vegas, NV

PS
The winner will receive keys for a Mercedes Benz.

Dec 30 '06 #1
9 2048
How about:
public static Int64 ToInt64(Int32 low, Int32 high)
{
Int64 x = high;
x <<= 32;
x = x | low;
}
Russell Mangel wrote:
Can someone show me how to speed this up?

1. Whats the fastest way for Unsafe C#?
2. What the fastest way for Safe C#?

public static Int64 ToInt64(Int32 low, Int32 high)
{
Byte[] lowBytes = BitConverter.Ge tBytes(low);
Byte[] highBytes = BitConverter.Ge tBytes(high);

Byte[] bytes = new Byte[8];

Array.Copy(lowB ytes, 0, bytes, 4, 4);
Array.Copy(high Bytes, 0, bytes, 0, 4);

return BitConverter.To Int64(bytes, 0);
}

Thanks.

Russell Mangel
Las Vegas, NV

PS
The winner will receive keys for a Mercedes Benz.
Dec 30 '06 #2
Geee...

Thats slow ;)

Try this

public static Int64 FastToInt64(Int 32 low, Int32 high)

{

return ((Int64)(high) << 32) + low;

}

"Russell Mangel" <ru*****@tymer. netwrote in message
news:O2******** ******@TK2MSFTN GP03.phx.gbl...
Can someone show me how to speed this up?

1. Whats the fastest way for Unsafe C#?
2. What the fastest way for Safe C#?

public static Int64 ToInt64(Int32 low, Int32 high)
{
Byte[] lowBytes = BitConverter.Ge tBytes(low);
Byte[] highBytes = BitConverter.Ge tBytes(high);

Byte[] bytes = new Byte[8];

Array.Copy(lowB ytes, 0, bytes, 4, 4);
Array.Copy(high Bytes, 0, bytes, 0, 4);

return BitConverter.To Int64(bytes, 0);
}

Thanks.

Russell Mangel
Las Vegas, NV

PS
The winner will receive keys for a Mercedes Benz.
Dec 30 '06 #3
Or, in one line (safe C#):

return (Int64)(((UInt6 4)high << 32) | (UInt32)low);

Tom Dacon
Dacon Software Consulting
"Russell Mangel" <ru*****@tymer. netwrote in message
news:O2******** ******@TK2MSFTN GP03.phx.gbl...
Can someone show me how to speed this up?

1. Whats the fastest way for Unsafe C#?
2. What the fastest way for Safe C#?

public static Int64 ToInt64(Int32 low, Int32 high)
{
Byte[] lowBytes = BitConverter.Ge tBytes(low);
Byte[] highBytes = BitConverter.Ge tBytes(high);

Byte[] bytes = new Byte[8];

Array.Copy(lowB ytes, 0, bytes, 4, 4);
Array.Copy(high Bytes, 0, bytes, 0, 4);

return BitConverter.To Int64(bytes, 0);
}

Thanks.

Russell Mangel
Las Vegas, NV

PS
The winner will receive keys for a Mercedes Benz.

Dec 30 '06 #4
In article news:11******** **************@ n51g2000cwc.goo glegroups.com,
Tim Clark wrote:
How about:
public static Int64 ToInt64(Int32 low, Int32 high)
{
Int64 x = high;
x <<= 32;
x = x | low;
}
Quite, except that Russell's definition of 'low' and 'high' may be
surprising... The output that I get, with the first line from Russell's
function, I get:

low & high = result
11223344 & aabbccdd = 11223344aabbccd d
11223344 & aabbccdd = 11223343aabbccd d
11223344 & aabbccdd = 11223343aabbccd d

So low is (Intel-wise) high, and high low... :-)

Out of interest I created two slighty different methods of doing it:
public static Int64 Alan1_ToInt64(I nt32 low, Int32 high)
{
const Int64 Bit32 = 0x100000000;
System.Diagnost ics.Debug.Asser t(Bit32 == (0x1L + UInt32.MaxValue ));
System.Diagnost ics.Debug.Asser t(Bit32 == (0x1L << 32));
Int64 result = high + Bit32 * low;
return result;
}

public static Int64 Alan2_ToInt64(I nt32 low, Int32 high)
{
Int64 result = high | ((Int64)low << 32);
return result;
}

And on inspecting the disassembly of both, assuming my unqualified
reading of x86 assembler is correct, both are JITted to a x86 shift
operation... So chose either depending on which is more
'understandable '.

Then I re-looked at my results and saw in the latter two lines: 11, 22,
33, 43!!!! WTF?
The I inputted all the functions that have been posted here so far, and
I get:

low & high = result
11223344 & aabbccdd = 11223344aabbccd d
11223344 & aabbccdd = 11223343aabbccd d
11223344 & aabbccdd = 11223343aabbccd d
11223344 & aabbccdd = aabbccdd1122334 4
11223344 & aabbccdd = aabbccdd1122334 4
11223344 & aabbccdd = aabbccdd1122334 4

low & high = result
aabbccdd & 11223344 = aabbccdd1122334 4
aabbccdd & 11223344 = aabbccdd1122334 4
aabbccdd & 11223344 = aabbccdd1122334 4
aabbccdd & 11223344 = ffffffffaabbccd d
aabbccdd & 11223344 = ffffffffaabbccd d
aabbccdd & 11223344 = 11223343aabbccd d

!!! It's past my bedtime, so I leave it for someone else to explain...
Unless I've got a buggy CPU, and only I get this behaviour. I haven't
gone back an re-inspected the assembler for instance.

The code it thus:
{
public void DoIt()
{
const Int32 low = 0x11223344, high =
unchecked((Int3 2)0xaabbccdd);
DoItWith(low, high);
const Int32 high2 = 0x11223344, low2 =
unchecked((Int3 2)0xaabbccdd);
DoItWith(low2, high2);
}

private static void DoItWith(Int32 low, Int32 high)
{
Console.WriteLi ne("{0,8} & {1,8} = {2}", "low", "high",
"result");
Console.WriteLi ne("{0:x} & {1:x} = {2:x}", low, high,
RussellsOrigina l_ToInt64(low, high));
Console.WriteLi ne("{0:x} & {1:x} = {2:x}", low, high,
Alan1_ToInt64(l ow, high));
Console.WriteLi ne("{0:x} & {1:x} = {2:x}", low, high,
Alan2_ToInt64(l ow, high));
Console.WriteLi ne("{0:x} & {1:x} = {2:x}", low, high,
TimClark_ToInt6 4(low, high));
Console.WriteLi ne("{0:x} & {1:x} = {2:x}", low, high,
TimClark_ToInt6 4(low, high));
Console.WriteLi ne("{0:x} & {1:x} = {2:x}", low, high,
rdrunner_FastTo Int64(low, high));
}

public static Int64 Alan1_ToInt64(I nt32 low, Int32 high)
{
const Int64 Bit32 = 0x100000000;
System.Diagnost ics.Debug.Asser t(Bit32 == (0x1L +
UInt32.MaxValue ));
System.Diagnost ics.Debug.Asser t(Bit32 == (0x1L << 32));
Int64 result = high + Bit32 * low;
return result;
}

public static Int64 Alan2_ToInt64(I nt32 low, Int32 high)
{
Int64 result = high + ((Int64)low << 32);
return result;
}

public static Int64 TimClark_ToInt6 4(Int32 low, Int32 high)
{
Int64 x = high;
x <<= 32;
// Warning: Bitwise-or operator used on a sign-extended
operand; consider casting to a smaller unsigned type first
x = x | low;
return x;
}

public static Int64 rdrunner_FastTo Int64(Int32 low, Int32 high)
{
return ((Int64)(high) << 32) + low;
}

public static Int64 TomDacon_ToInt6 4(Int32 low, Int32 high)
{
return (Int64)(((UInt6 4)high << 32) | (UInt32)low);
}

public static Int64 RussellsOrigina l_ToInt64(Int32 low, Int32
high)
{
Byte[] lowBytes = BitConverter.Ge tBytes(low);
Byte[] highBytes = BitConverter.Ge tBytes(high);

Byte[] bytes = new Byte[8];

Array.Copy(lowB ytes, 0, bytes, 4, 4);
Array.Copy(high Bytes, 0, bytes, 0, 4);

return BitConverter.To Int64(bytes, 0);
}

}

Alan
Russell Mangel wrote:
>Can someone show me how to speed this up?

1. Whats the fastest way for Unsafe C#?
2. What the fastest way for Safe C#?

public static Int64 ToInt64(Int32 low, Int32 high)
{
Byte[] lowBytes = BitConverter.Ge tBytes(low);
Byte[] highBytes = BitConverter.Ge tBytes(high);

Byte[] bytes = new Byte[8];

Array.Copy(lowB ytes, 0, bytes, 4, 4);
Array.Copy(high Bytes, 0, bytes, 0, 4);

return BitConverter.To Int64(bytes, 0);
}

Thanks.

Russell Mangel
Las Vegas, NV

PS
The winner will receive keys for a Mercedes Benz.
--
Alan J. McFarlane
http://www.alanjmcf.me.uk/
Please follow-up in the newsgroup for the benefit of all.

Dec 30 '06 #5
In article news:45******** **************@ ptn-nntp-reader02.plus.n et,
Alan J. McFarlane wrote:
In article news:11******** **************@ n51g2000cwc.goo glegroups.com,
Tim Clark wrote:
[...]
public static Int64 Alan2_ToInt64(I nt32 low, Int32 high)
{
Int64 result = high | ((Int64)low << 32);
Actually I was using a + rather than a | there.
return result;
}
[...]

Dec 30 '06 #6
On Sat, 30 Dec 2006 13:39:30 -0800, "Russell Mangel"
<ru*****@tymer. netwrote:
>Can someone show me how to speed this up?

1. Whats the fastest way for Unsafe C#?
2. What the fastest way for Safe C#?

public static Int64 ToInt64(Int32 low, Int32 high)
{
Byte[] lowBytes = BitConverter.Ge tBytes(low);
Byte[] highBytes = BitConverter.Ge tBytes(high);

Byte[] bytes = new Byte[8];

Array.Copy(lowB ytes, 0, bytes, 4, 4);
Array.Copy(high Bytes, 0, bytes, 0, 4);

return BitConverter.To Int64(bytes, 0);
}

Thanks.

Russell Mangel
Las Vegas, NV

PS
The winner will receive keys for a Mercedes Benz.
I have some good news and some bad news. Your method can be speeded
up but all the methods I tried, including yours, come up with the
wrong answer!

The results from the program below look like:
ToInt64A() had 50000 errors and took 1635 ticks on average.
ToInt64B() had 50000 errors and took 190 ticks on average.
ToInt64C() had 50000 errors and took 232 ticks on average.
ToInt64D() had 50000 errors and took 163 ticks on average.
ToInt64E() had 50000 errors and took 145 ticks on average.

where ToInt64A() is your method and B to E are alternative methods.

Running with one repetition and showing errors gives:
ToInt32A: result -53023518752769 != 922337203685476 3462 expected
ToInt64A() had 1 errors and took 41386216 ticks on average.
ToInt32B: result 922337203255979 6166 != 922337203685476 3462 expected
ToInt64B() had 1 errors and took 1436216 ticks on average.
ToInt32C: result 922337202826482 8870 != 922337203685476 3462 expected
ToInt64C() had 1 errors and took 1839352 ticks on average.
ToInt32D: result 922337203255979 6166 != 922337203685476 3462 expected
ToInt64D() had 1 errors and took 1245720 ticks on average.
ToInt32E: result 922337203255979 6166 != 922337203685476 3462 expected
ToInt64E() had 1 errors and took 1245144 ticks on average.

your method appears to have a problem with signs. I have not been
able to track down the problems with the other methods in the short
time I have been looking.

The code I was using is below, perhaps someone else can find the
problem with the different methods (careful with line wrapping).

rossum

/////// Code //////////

public static Int64 ToInt64A(Int32 low, Int32 high) {
Byte[] lowBytes = BitConverter.Ge tBytes(low);
Byte[] highBytes = BitConverter.Ge tBytes(high);

Byte[] bytes = new Byte[8];
Array.Copy(lowB ytes, 0, bytes, 4, 4);
Array.Copy(high Bytes, 0, bytes, 0, 4);

return BitConverter.To Int64(bytes, 0);
}

public static Int64 ToInt64B(Int32 low, Int32 high) {
const Int64 shift = (Int64)UInt32.M axValue + 1;
return high * shift + low;
}

public static Int64 ToInt64C(Int32 low, Int32 high) {
return 2 * Math.BigMul(hig h, Int32.MaxValue) + 2 * high + low;
}

public static Int64 ToInt64D(Int32 low, Int32 high) {
Int64 result = high;
return (result << 32) + low;
}

public static Int64 ToInt64E(Int32 low, Int32 high) {
return ((Int64)high << 32) + low;
}

public delegate Int64 ToInt64(Int32 lo, Int32 hi);

static void Main() {
//const int limit = 1;
const int limit = 50000;

ToInt64[] converters = new ToInt64[5];
converters[0] = ToInt64A;
converters[1] = ToInt64B;
converters[2] = ToInt64C;
converters[3] = ToInt64D;
converters[4] = ToInt64E;

Stopwatch timer = new Stopwatch();

char name = 'A';
Int64 expected = Int64.MaxValue - 12345;
Int32 lo = (Int32)(expecte d & 0xFFFFFFFFL);
Int32 hi = (Int32)(expecte d >32);
Int64 result;
int errorCount;
foreach (ToInt64 TI64 in converters) {
errorCount = 0;
timer.Reset();
timer.Start();
for (int i = 0; i < limit; ++i) {
result = TI64(lo, hi);
if (result != expected) {
++errorCount;
//Console.WriteLi ne("ToInt32{0} : result {1} != {2}
expected", name, result, expected);
}
}
timer.Stop();
Console.WriteLi ne("ToInt64{0}( ) had {1} errors and took
{2} ticks on average.",
name, errorCount, timer.ElapsedTi cks / limit);
++name;
}
Console.Write(" Press [Enter] to continue... ");
Console.ReadLin e();
} // end Main()

///////////////////////

Dec 30 '06 #7
public static Int64 ToInt64F(Int32 low, Int32 high)
{
return (((Int64)high) << 32) | (UInt32)low;
}
Dec 31 '06 #8
Theneolab wrote:
public static Int64 ToInt64F(Int32 low, Int32 high)
{
return (((Int64)high) << 32) | (UInt32)low;
}
Looking back Tom beat me to it.
Dec 31 '06 #9
Russell Mangel wrote:
Can someone show me how to speed this up?

1. Whats the fastest way for Unsafe C#?
2. What the fastest way for Safe C#?

public static Int64 ToInt64(Int32 low, Int32 high)
{
Byte[] lowBytes = BitConverter.Ge tBytes(low);
Byte[] highBytes = BitConverter.Ge tBytes(high);

Byte[] bytes = new Byte[8];

Array.Copy(lowB ytes, 0, bytes, 4, 4);
Array.Copy(high Bytes, 0, bytes, 0, 4);

return BitConverter.To Int64(bytes, 0);
}
Some experiments indicates that there are no faster
methods than the shift/arithmetic code.

See code below.

Arne

using System;
using System.Runtime. InteropServices ;

namespace E
{
[StructLayout(La youtKind.Explic it)]
internal struct IntLong
{
[FieldOffset(0)] public int lowintval;
[FieldOffset(4)] public int highintval;
[FieldOffset(0)] public long longval;
}
public class MainClass
{
public static long ToInt64_Bytes(i nt high, int low)
{
byte[] highBytes = BitConverter.Ge tBytes(high);
byte[] lowBytes = BitConverter.Ge tBytes(low);
byte[] bytes = new Byte[8];
Array.Copy(high Bytes, 0, bytes, 4, 4);
Array.Copy(lowB ytes, 0, bytes, 0, 4);
return BitConverter.To Int64(bytes, 0);
}
public static long ToInt64_Arith(i nt high, int low)
{
return high * 0x100000000L + (uint)low;
}
public static long ToInt64_Shift(i nt high, int low)
{
return (((long)high)<< 32) | (uint)low;
}
private static IntLong cvt;
public static long ToInt64_Union(i nt high, int low)
{
cvt.highintval = high;
cvt.lowintval = low;
return cvt.longval;
}
public unsafe static long ToInt64_Pointer (int high, int low)
{
long res;
*(((int *)&res)+1) = high;
*((int *)&res) = low;
return res;
}
private const int N = 200000000;
public static void Main(string[] args)
{
Random rng = new Random();
for(int i = 0; i < 1000; i++)
{
byte[] b = new byte[8];
rng.NextBytes(b );
long v = BitConverter.To Int64(b, 0);
int vhigh = (int)(v >32);
int vlow = (int)v;
long v2 = ToInt64_Bytes(v high, vlow);
if(v2 != v)
{
Console.WriteLi ne("Bytes: " + v + " -" + v2);
}
long v3 = ToInt64_Arith(v high, vlow);
if(v3 != v)
{
Console.WriteLi ne("Arith: " + v + " -" + v3);
}
long v4 = ToInt64_Shift(v high, vlow);
if(v4 != v)
{
Console.WriteLi ne("Shift: " + v + " -" + v4);
}
long v5 = ToInt64_Union(v high, vlow);
if(v5 != v)
{
Console.WriteLi ne("Union: " + v + " -" + v5);
}
long v6 = ToInt64_Pointer (vhigh, vlow);
if(v6 != v)
{
Console.WriteLi ne("Pointer: " + v + " -" + v6);
}
}
DateTime t1 = DateTime.Now;
for(int i = 0; i < N; i++)
{
ToInt64_Bytes(1 2345,67890);
}
DateTime t2 = DateTime.Now;
Console.WriteLi ne("Bytes: " + (t2 - t1).TotalSecond s);
DateTime t3 = DateTime.Now;
for(int i = 0; i < N; i++)
{
ToInt64_Arith(1 2345,67890);
}
DateTime t4 = DateTime.Now;
Console.WriteLi ne("Arith: " + (t4 - t3).TotalSecond s);
DateTime t5 = DateTime.Now;
for(int i = 0; i < N; i++)
{
ToInt64_Shift(1 2345,67890);
}
DateTime t6 = DateTime.Now;
Console.WriteLi ne("Shift: " + (t6 - t5).TotalSecond s);
DateTime t7 = DateTime.Now;
for(int i = 0; i < N; i++)
{
ToInt64_Union(1 2345,67890);
}
DateTime t8 = DateTime.Now;
Console.WriteLi ne("Union: " + (t8 - t7).TotalSecond s);
DateTime t9 = DateTime.Now;
for(int i = 0; i < N; i++)
{
ToInt64_Pointer (12345,67890);
}
DateTime t10 = DateTime.Now;
Console.WriteLi ne("Pointer: " + (t10 - t9).TotalSecond s);
Console.ReadLin e();
}
}
}
Dec 31 '06 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

34
2461
by: Jacek Generowicz | last post by:
I have a program in which I make very good use of a memoizer: def memoize(callable): cache = {} def proxy(*args): try: return cache except KeyError: return cache.setdefault(args, callable(*args)) return proxy which, is functionally equivalent to
29
3591
by: Bart Nessux | last post by:
Just fooling around this weekend. Wrote and timed programs in C, Perl and Python. Each Program counts to 1,000,000 and prints each number to the console as it counts. I was a bit surprised. I'm not an expert C or Perl programming expery, I'm most familiar with Python, but can use the others as well. Here are my results: C = 23 seconds Python = 26.5 seconds
28
2593
by: Maboroshi | last post by:
Hi I am fairly new to programming but not as such that I am a total beginner From what I understand C and C++ are faster languages than Python. Is this because of Pythons ability to operate on almost any operating system? Or is there many other reasons why? I understand there is ansi/iso C and C++ and that ANSI/ISO Code will work on any system If this is the reason why, than why don't developers create specific Python Distrubutions...
3
2280
by: I.V. Aprameya Rao | last post by:
Hi I have to implement a flat file dbms. The basic condition is that relations will be given in files and i will have to run certain select project join queries on those relations. Can someone tell me as to which language will be faster, python or C++?? Aprameya
7
3040
by: YAZ | last post by:
Hello, I have a dll which do some number crunching. Performances (execution speed) are very important in my application. I use VC6 to compile the DLL. A friend of mine told me that in Visual studio 2003 .net optimization were enhanced and that i must gain in performance if I switch to VS 2003 or intel compiler. So I send him the project and he returned a compiled DLL with VS 2003. Result : the VS 2003 compiled Dll is slower than the VC6...
11
1985
by: Jim Lewis | last post by:
Has anyone found a good link on exactly how to speed up code using pyrex? I found various info but the focus is usually not on code speedup.
5
575
by: pt | last post by:
Hi, i am wonderng what is faster according to accessing speed to read these data structure from the disk in c/c++ including alignment handling if we access it on little endian system 32 bits system + OS e.g. Windows, Linux, WinCE. I am not quite sure about the alignment of the memory.... soln. 1: should be faster, I am not sure. idx size (bytes) 1 4
19
3804
by: llothar | last post by:
I must say i didn't expect this. I just did some measures on FreeBSD 6.2 with gcc 3.4.6 and there is absolutely no significant difference between 32 and 64 bit mode - neither in compilation speed, nor in speed of the compiled result. As a benchmark i took a bootstrap of the SmallEiffel Compiler (which has 38 files with around 100 kloc). The times i got were very reliable. The bootstraping (compile the c files from last eiffel compiler...
47
1418
by: Mike Williams | last post by:
I'm trying to decide whether or not I need to move to a different development tool and I'm told that VB6 code, when well written, can be ten times faster than vb.net, but that if its badly written it can be ten times slower. Is that correct? I'm quite competent at writing code myself and so most of my code will be quite well written, and I don't want to move to vb.net if well written VB6 code is ten times faster. Have I been told the...
0
8683
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
0
9170
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
0
7739
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own.... Now, this would greatly impact the work of software developers. The idea...
1
6528
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
0
4371
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
0
4622
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
1
3052
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
2
2336
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
3
2007
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.