473,626 Members | 3,305 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

GC having spikes that take more then 60% cpu time

Hi,

we are currently writing an mostly singlethreaded (game)server
application in c#. But we are encountering problems with the Garbage
Collector: After a certain time but also apparently randomly the GC
starts working Alot and taking up to 60-70% of the cpu time, which
results in huge lags in responce time of the server.

The server uses (depending on the setting) around 350-800 MB of memory
( the servers we tested this on had from 1gb to 3gb of memory) most of
which is in gen2 heap. That itself is inevitably since its loads
spawners (object that will create mobiles or gameobjects over the time)
and gameobjects / mobiles into the world.

Now we think the problem might be comming from the gc having to move
through those when a GC occurs. ( Can you clear me up on this point?
afaik worst case the gc has to check all objects to see if they hold a
reference to objects on gen0, or am i misunderstandin g this?)

Removing the long-living objects ofcourse stops this problem, but then
the server takes nearly no memory at all.

Another weird thing is, that our gen0 seems to be maxed out all the
time. This could come from the network part, which stores incomming
data into a packet that is enqueued and then processed by the mainloop
every 20 milliseconds(fo r every client). Inserting a GC.GetGeneratio n
debug output shows that from 50 packets around 5 make it to generation1
and 1 to generation2, could this be cause for the problem?

I doubt this though because the spikes don't occur at the same time a
gen2 collection occurs. The count of gen0 - gen1 - gen2 isnt that bad
either its approximatly 1000 - 500 - 1.

We though moving all the very long living objects that stay through the
whole applications lifetime to the large object heap could avoid those
making problems, but apparently you cant move small objects there
anyway?

Or it could be that gen0 / 1 are to fragmented. From a dump we get:
Gen0 is size 423592 with 71148 free - 16% fragmentation?
Gen1 is size 1134596 with 71160 free - 6% fragmentation?
Gen2 is size 530020272 with 6989736 free - 1.3% fragmentation?

Is it true that fragmentation above 10% is a nono in gen0 heap? if yes
how can we find out what is causing it?

What would really help me are some hints how to figure out what causes
the GC to use that much cpu time. At the moment we can only guess,
which isn't really bringing forth anything.

How should we start investigating what is causing this problem? I
assume there is no way to see what the garbage collector is doing when
he is taking that much cpu? if its marking objects for collection,
moving them or whatever?

We also tried to get dumps from the heap before and after a "spike" but
with about 8 million objects its hard to see any relation between
before and after a spike.

I would be greatfull for any tipps you could supply.

Thank you

Sep 10 '06 #1
14 3468
Your memory pattern matches quite nicely to what Rico Mariani calls a
"Mid-life Crisis".
You can check this for some recommendations :
http://blogs.msdn.com/ricom/archive/.../04/41281.aspx
"Gotisch" <go*****@gmail. comha scritto nel messaggio
news:11******** **************@ i3g2000cwc.goog legroups.com...
Hi,

we are currently writing an mostly singlethreaded (game)server
application in c#. But we are encountering problems with the Garbage
Collector: After a certain time but also apparently randomly the GC
starts working Alot and taking up to 60-70% of the cpu time, which
results in huge lags in responce time of the server.

The server uses (depending on the setting) around 350-800 MB of memory
( the servers we tested this on had from 1gb to 3gb of memory) most of
which is in gen2 heap. That itself is inevitably since its loads
spawners (object that will create mobiles or gameobjects over the time)
and gameobjects / mobiles into the world.

Now we think the problem might be comming from the gc having to move
through those when a GC occurs. ( Can you clear me up on this point?
afaik worst case the gc has to check all objects to see if they hold a
reference to objects on gen0, or am i misunderstandin g this?)

Removing the long-living objects ofcourse stops this problem, but then
the server takes nearly no memory at all.

Another weird thing is, that our gen0 seems to be maxed out all the
time. This could come from the network part, which stores incomming
data into a packet that is enqueued and then processed by the mainloop
every 20 milliseconds(fo r every client). Inserting a GC.GetGeneratio n
debug output shows that from 50 packets around 5 make it to generation1
and 1 to generation2, could this be cause for the problem?

I doubt this though because the spikes don't occur at the same time a
gen2 collection occurs. The count of gen0 - gen1 - gen2 isnt that bad
either its approximatly 1000 - 500 - 1.

We though moving all the very long living objects that stay through the
whole applications lifetime to the large object heap could avoid those
making problems, but apparently you cant move small objects there
anyway?

Or it could be that gen0 / 1 are to fragmented. From a dump we get:
Gen0 is size 423592 with 71148 free - 16% fragmentation?
Gen1 is size 1134596 with 71160 free - 6% fragmentation?
Gen2 is size 530020272 with 6989736 free - 1.3% fragmentation?

Is it true that fragmentation above 10% is a nono in gen0 heap? if yes
how can we find out what is causing it?

What would really help me are some hints how to figure out what causes
the GC to use that much cpu time. At the moment we can only guess,
which isn't really bringing forth anything.

How should we start investigating what is causing this problem? I
assume there is no way to see what the garbage collector is doing when
he is taking that much cpu? if its marking objects for collection,
moving them or whatever?

We also tried to get dumps from the heap before and after a "spike" but
with about 8 million objects its hard to see any relation between
before and after a spike.

I would be greatfull for any tipps you could supply.

Thank you

Sep 11 '06 #2

Laura T Wrote:
Your memory pattern matches quite nicely to what Rico Mariani calls a
"Mid-life Crisis".
You can check this for some recommendations :
http://blogs.msdn.com/ricom/archive/.../04/41281.aspx
In his article he writes:

"To get overall promotion rates, use the GC Performance counters, there
are counters that will tell you how much stuff is getting promoted into
generation 2. You want that number to be as small as possible - zero
is ideal and even achievable in steady state, but as long as the rate
of generation 2 collects is staying low, you'll be fine."

We have like 298245 gen0 collections 100455 gen1 collections and 1751
gen2 collections at the moment. So i cant really say we have to many
gen2 collections. It more looks like we have to many gen1 collections.
but those shouldn't be that time consuming should they? 300 - 100 - 2
is the proportion so this either means we dont have enough gen0
collections or to many gen1 ( i read somewhere the perfect proportion
is (100gen0 10gen1 1gen2). But gen1 collections are not
"midlife-crisis" collections are they?

Sep 11 '06 #3
Gotisch,

Something you said in your original post stood out to me. You said that
your app is a single threaded game server application. Is your server
running on a machine where you can set the runtime to gc on a separate
thread (in other words, not the workstation edition of the CLR). You might
be able to amortize the costs of GC out if you enable this (given that it is
possible given the hardware and OS that your app is running on).

Hope this helps.
--
- Nicholas Paldino [.NET/C# MVP]
- mv*@spam.guard. caspershouse.co m

"Gotisch" <go*****@gmail. comwrote in message
news:11******** **************@ b28g2000cwb.goo glegroups.com.. .
>
Laura T Wrote:
>Your memory pattern matches quite nicely to what Rico Mariani calls a
"Mid-life Crisis".
You can check this for some recommendations :
http://blogs.msdn.com/ricom/archive/.../04/41281.aspx

In his article he writes:

"To get overall promotion rates, use the GC Performance counters, there
are counters that will tell you how much stuff is getting promoted into
generation 2. You want that number to be as small as possible - zero
is ideal and even achievable in steady state, but as long as the rate
of generation 2 collects is staying low, you'll be fine."

We have like 298245 gen0 collections 100455 gen1 collections and 1751
gen2 collections at the moment. So i cant really say we have to many
gen2 collections. It more looks like we have to many gen1 collections.
but those shouldn't be that time consuming should they? 300 - 100 - 2
is the proportion so this either means we dont have enough gen0
collections or to many gen1 ( i read somewhere the perfect proportion
is (100gen0 10gen1 1gen2). But gen1 collections are not
"midlife-crisis" collections are they?

Sep 11 '06 #4

"Gotisch" <go*****@gmail. comschrieb im Newsbeitrag
news:11******** **************@ b28g2000cwb.goo glegroups.com.. .
>
Laura T Wrote:
>Your memory pattern matches quite nicely to what Rico Mariani calls a
"Mid-life Crisis".
You can check this for some recommendations :
http://blogs.msdn.com/ricom/archive/.../04/41281.aspx

In his article he writes:

"To get overall promotion rates, use the GC Performance counters, there
are counters that will tell you how much stuff is getting promoted into
generation 2. You want that number to be as small as possible - zero
is ideal and even achievable in steady state, but as long as the rate
of generation 2 collects is staying low, you'll be fine."

We have like 298245 gen0 collections 100455 gen1 collections and 1751
gen2 collections at the moment. So i cant really say we have to many
gen2 collections. It more looks like we have to many gen1 collections.
but those shouldn't be that time consuming should they? 300 - 100 - 2
is the proportion so this either means we dont have enough gen0
collections or to many gen1 ( i read somewhere the perfect proportion
is (100gen0 10gen1 1gen2). But gen1 collections are not
"midlife-crisis" collections are they?
Hi Gotisch,

reading the article and the passage you cited the problem seemes to be the
number
of objects promoted to gen2, not the number of gen2 collections.

in your first post you are talking about packets with incoming data that can
survive to gen2.
this could be the mid-life-object rico is talking about.
You should look if they are referencing any objects wich aren't needed
anymore. this references should
be nulled prior to enqueuing the packets.

hth
Sep 11 '06 #5

"Gotisch" <go*****@gmail. comwrote in message
news:11******** **************@ i3g2000cwc.goog legroups.com...
| Hi,
|
| we are currently writing an mostly singlethreaded (game)server
| application in c#. But we are encountering problems with the Garbage
| Collector: After a certain time but also apparently randomly the GC
| starts working Alot and taking up to 60-70% of the cpu time, which
| results in huge lags in responce time of the server.
|
| The server uses (depending on the setting) around 350-800 MB of memory
| ( the servers we tested this on had from 1gb to 3gb of memory) most of
| which is in gen2 heap. That itself is inevitably since its loads
| spawners (object that will create mobiles or gameobjects over the time)
| and gameobjects / mobiles into the world.
|
| Now we think the problem might be comming from the gc having to move
| through those when a GC occurs. ( Can you clear me up on this point?
| afaik worst case the gc has to check all objects to see if they hold a
| reference to objects on gen0, or am i misunderstandin g this?)
|
| Removing the long-living objects ofcourse stops this problem, but then
| the server takes nearly no memory at all.
|
| Another weird thing is, that our gen0 seems to be maxed out all the
| time. This could come from the network part, which stores incomming
| data into a packet that is enqueued and then processed by the mainloop
| every 20 milliseconds(fo r every client). Inserting a GC.GetGeneratio n
| debug output shows that from 50 packets around 5 make it to generation1
| and 1 to generation2, could this be cause for the problem?
|
| I doubt this though because the spikes don't occur at the same time a
| gen2 collection occurs. The count of gen0 - gen1 - gen2 isnt that bad
| either its approximatly 1000 - 500 - 1.
|
| We though moving all the very long living objects that stay through the
| whole applications lifetime to the large object heap could avoid those
| making problems, but apparently you cant move small objects there
| anyway?
|
| Or it could be that gen0 / 1 are to fragmented. From a dump we get:
| Gen0 is size 423592 with 71148 free - 16% fragmentation?
| Gen1 is size 1134596 with 71160 free - 6% fragmentation?
| Gen2 is size 530020272 with 6989736 free - 1.3% fragmentation?
|
| Is it true that fragmentation above 10% is a nono in gen0 heap? if yes
| how can we find out what is causing it?
|
| What would really help me are some hints how to figure out what causes
| the GC to use that much cpu time. At the moment we can only guess,
| which isn't really bringing forth anything.
|
| How should we start investigating what is causing this problem? I
| assume there is no way to see what the garbage collector is doing when
| he is taking that much cpu? if its marking objects for collection,
| moving them or whatever?
|
| We also tried to get dumps from the heap before and after a "spike" but
| with about 8 million objects its hard to see any relation between
| before and after a spike.
|
| I would be greatfull for any tipps you could supply.
|
| Thank you
|

Well, you have a very high allocation rate, this combined with gen0/gen1
fragmentation, can lead to a higher GC rate than normal because part of the
gen0 cannot be compacted due to the fragmentation. While gen0 collections
are cheap, gen2 collections are expensive, especially when a lot of objects
reach gen2 where they die. So it's not uncommon to see spikes in % Time in
GC reaching 70%.
First thing you should inspect is the # Induced GC's, this counter should be
at 0 (preferably), to keep this counter as low as possible:
- don't ever call GC.Collect() or GC.Collect(2) or GC.Collect(2)
- Don't call GC methods like GC.GetTotalMemo ry(true), that force GC sweeps
(these are needed to update the counters).

Second thing you should take care of is the pinned object allocations, try
to pre-allocate the buffers from the LOH if you can, or you need to change
your design such that you release pinned buffers as soon as possible (watch
out for asynchronous receives).

Don't know what server you are running this on, but from what I see from
your usage scenario, you should not run this on a single CPU box, you will
need at least two CPU's possibly more, speed is not as important as the
number of.
Also, you should not run this on V1.1, you need v2.

Willy.



Sep 11 '06 #6
"Gotisch" <go*****@gmail. comwrote Hi,
we are currently writing an mostly singlethreaded (game)server
application in c#.
Ouch.

You may want to give some serious thought to re-thinking this approach. A
canonical example of "When to use threads" is "when writing a game server".
But we are encountering problems with the Garbage
Collector: After a certain time but also apparently randomly the GC
starts working Alot and taking up to 60-70% of the cpu time, which
results in huge lags in responce time of the server.
Time to memory profile your application.
The server uses (depending on the setting) around 350-800 MB of memory
( the servers we tested this on had from 1gb to 3gb of memory) most of
which is in gen2 heap. That itself is inevitably since its loads
spawners (object that will create mobiles or gameobjects over the time)
and gameobjects / mobiles into the world.
As a quick aside, if you have a number of these Spawners, and their lifetime
is infinite, you may want to try loading them into the Large Object Heap.

>
Now we think the problem might be comming from the gc having to move
through those when a GC occurs. ( Can you clear me up on this point?
afaik worst case the gc has to check all objects to see if they hold a
reference to objects on gen0, or am i misunderstandin g this?)

Removing the long-living objects ofcourse stops this problem, but then
the server takes nearly no memory at all.

Another weird thing is, that our gen0 seems to be maxed out all the
time. This could come from the network part, which stores incomming
data into a packet that is enqueued and then processed by the mainloop
every 20 milliseconds(fo r every client). Inserting a GC.GetGeneratio n
debug output shows that from 50 packets around 5 make it to generation1
and 1 to generation2, could this be cause for the problem?

I doubt this though because the spikes don't occur at the same time a
gen2 collection occurs. The count of gen0 - gen1 - gen2 isnt that bad
either its approximatly 1000 - 500 - 1.

We though moving all the very long living objects that stay through the
whole applications lifetime to the large object heap could avoid those
making problems, but apparently you cant move small objects there
anyway?

Or it could be that gen0 / 1 are to fragmented. From a dump we get:
Gen0 is size 423592 with 71148 free - 16% fragmentation?
Gen1 is size 1134596 with 71160 free - 6% fragmentation?
Gen2 is size 530020272 with 6989736 free - 1.3% fragmentation?

Is it true that fragmentation above 10% is a nono in gen0 heap? if yes
how can we find out what is causing it?

What would really help me are some hints how to figure out what causes
the GC to use that much cpu time. At the moment we can only guess,
which isn't really bringing forth anything.

How should we start investigating what is causing this problem? I
assume there is no way to see what the garbage collector is doing when
he is taking that much cpu? if its marking objects for collection,
moving them or whatever?

We also tried to get dumps from the heap before and after a "spike" but
with about 8 million objects its hard to see any relation between
before and after a spike.

I would be greatfull for any tipps you could supply.

Thank you

Sep 11 '06 #7
[Fragmention only response]

"Gotisch" <go*****@gmail. comwrote
Or it could be that gen0 / 1 are to fragmented. From a dump we get:
Gen0 is size 423592 with 71148 free - 16% fragmentation?
Gen1 is size 1134596 with 71160 free - 6% fragmentation?
Gen2 is size 530020272 with 6989736 free - 1.3% fragmentation?

Is it true that fragmentation above 10% is a nono in gen0 heap? if yes
how can we find out what is causing it?
The way your're doing network I/O is almost certainly causing your heap
fragmentation.

The blogs post here:
http://www.coversant.net/dotnetnuke/...9/Default.aspx

goes into this in great detail. You're sending memory into the socket for
receive (and for send), and that memory gets pinned due to Interop issues.
Because it's pinned, it can't be compacted and you start to get
fragmentation.

--
Chris Mullins
Sep 11 '06 #8
[How to fix the problem response]

"Gotisch" <go*****@gmail. comwrote
Or it could be that gen0 / 1 are to fragmented. From a dump we get:
Gen0 is size 423592 with 71148 free - 16% fragmentation?
Gen1 is size 1134596 with 71160 free - 6% fragmentation?
Gen2 is size 530020272 with 6989736 free - 1.3% fragmentation?

What would really help me are some hints how to figure out what causes
the GC to use that much cpu time. At the moment we can only guess,
which isn't really bringing forth anything.

How should we start investigating what is causing this problem?
The best option by far is the Scitech memory profiler. You can find this at:
http://memprofiler.com/

It's going to take you 4 or 5 hours to figure out how make sense of the
output that it gives you, but once you do, your memory issues will jump
right out at ya.
>I assume there is no way to see what the garbage collector is doing when
he is taking that much cpu? if its marking objects for collection,
moving them or whatever?
It's probably a combination of many little things:
- forgetting to call dispose on a number of object, so the GC has to
Finalize them instead, thereby decresing performacne
- Probably doing way more memory allocations than you really need to. Adding
in some low-level cache code often helps with memory pressure.
- Pinned object being sent into Windows (via Socket reads/write) causes
fragmentation and makes the GC work much harder.
- Leaking memory. Big systems do this, even in a GC world.
- Allocating too much from the heap - if there's a LOT of small stuff, turn
it into structures that get stack allocated.
We also tried to get dumps from the heap before and after a "spike" but
with about 8 million objects its hard to see any relation between
before and after a spike.
The SciTech profiler has a nice way to compare heap-dumps.

--
Chris Mullins
Sep 11 '06 #9
"Gotisch" <go*****@gmail. comwrote Hi,
we are currently writing an mostly singlethreaded (game)server
application in c#.
Ouch.

You may want to give some serious thought to re-thinking this approach. A
canonical example of "When to use threads" is "when writing a game server".
But we are encountering problems with the Garbage
Collector: After a certain time but also apparently randomly the GC
starts working Alot and taking up to 60-70% of the cpu time, which
results in huge lags in responce time of the server.
Time to memory profile your application.
The server uses (depending on the setting) around 350-800 MB of memory
( the servers we tested this on had from 1gb to 3gb of memory) most of
which is in gen2 heap. That itself is inevitably since its loads
spawners (object that will create mobiles or gameobjects over the time)
and gameobjects / mobiles into the world.
As a quick aside, if you have a number of these Spawners, and their lifetime
is infinite, you may want to try loading them into the Large Object Heap.You
may need to play some weird tricks to do this, but getting them out of the
main Gen0/Gen1/Gen2 heap may help things out.

Just be SURE that you don't get much churn in there, or things will get
worse.
Another weird thing is, that our gen0 seems to be maxed out all the
time. This could come from the network part, which stores incomming
data into a packet that is enqueued and then processed by the mainloop
every 20 milliseconds(fo r every client).
You're doing this single-threaded? You really, really want to switch over to
an asynchronous model of network programming. You'll gain lots of
performance and your application responsiveness will shoot way up.

Inserting a GC.GetGeneratio n
debug output shows that from 50 packets around 5 make it to generation1
and 1 to generation2, could this be cause for the problem?
It's certainly contributing to the problem, but unlikley to be the cause.
You really want to avoid these things being promoted into Gen2 if you can
help it, as a Gen2 GC takes a very long time. There are ways to do this:

- pre-create a number of packets at application startup (say 500 or 1000, or
whatever number you think is big enough) and store them in a data structure
of some sort. When new data comes in, check a pre-allocated packet out of
the pool, and copy your data into it. When you're all done processing the
packet, check the packet back into the available pool. Essentially, you just
want to create a Packet Pool. Doing this will make sure the packet pool gets
into the Gen2 heap, and that your standard packets during processing don't
have any impact on GC.
We though moving all the very long living objects that stay through the
whole applications lifetime to the large object heap could avoid those
making problems, but apparently you cant move small objects there
anyway?
Just make your object bigger. That's always easy. It's making them smaller
that's tough! :)
I would be greatfull for any tipps you could supply.
As I posted in another response to this thread, time to break out the
Scitech Memory Profiler...

--
Chris Mullins, MCSD.NET, MCPD:Enterprise
http://www.coversant.net/blogs/cmullins
Sep 11 '06 #10

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

Similar topics

2
5159
by: Steve Thorpe | last post by:
Hi I have have two linked SQL Servers and I am trying to get remote writes working correctly (fast). I have configured the DB link on both machines to: Point at each others DB. I have security set up to map each others server logins and Server Options: Collation Compatible, Data Access, RPC, RPC Out, Use Remote Collation all checked
13
2926
by: python | last post by:
hello and thanks for reading this, i have been a dos/windows user using some form of the basic language for 30 years now. i own and run a small programming company and there is one feature that keeps me in the windows/basic world. while i will agree that it has not evolved well, it does have one awesome feature that i have yet to see replicated in any linux product that i know about so far. i am a long time windows user and have had...
8
5329
by: Trishia Rose | last post by:
this is something ive always wondered, does it take cpu time at run time to typecast or just at compile time? for example consider the two little bits of code: int a = 5; int b = a; and: char *a = (char*) 5;
0
4102
by: jjs0713 | last post by:
Hi, Everyone ! I made a C program. I want to know serial communication at micom which is ATMEL 89C52. It's received to micom RX pin(serial comm.) NMEA format from some set. I'd like to take UTC Time. then I'll display to LCD output. I really need to help which is to get UTC time from NMEA format. 1. NMEA format $GPGGA,000915.5,3727.85245,N,12702.53467,E,0,00,,684.6,M,18.5,M,,*71
2
3693
by: Ken Varn | last post by:
I have a managed C++ method that I call from ASP.NET to set the time zone on the local box. I call SetTimeZoneInformation, which does not return an error, but the time zone remains unchanged. I have checked the web for any information on this, but have not found any articles that relate to this specific problem. Can anyone tell me what is wrong here? Here is a sample snippet of the method: Note that TimeZoneInfo is my own managed...
5
1853
by: David Smithz | last post by:
Hi there, From a customer database table, I need to get a list of all the customers that have the same birthdays and their names. While I can get a count of this and the name of one of the customers of the group sharing the same birthday by using the following code: SELECT ALL count(dob) AS DOBcount, dob, firstname, lastname FROM accounts
5
1471
Hunderpanzer
by: Hunderpanzer | last post by:
I was just looking around on this site, and went into the Jobs category. I clicked on an interesting job advertisement for BitTorrent - I'm sure we all know what that is, and as a test, the employer wanted someone to give the answer to a problem which would prove their understanding of their math (maybe not so much) and python programming skills. Don't worry, I'm not looking to steal the answer and take the job. I know nothing of Python,...
2
4127
by: Chandrajit | last post by:
Hi How we can take run time database back using Visual Basic 6.0. For SQL Server and Access database.
0
8262
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
8196
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
8701
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
8637
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth. The Art of Business Website Design Your website is...
1
8364
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
0
8502
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
0
7192
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...
0
5571
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert into image. Globals.ThisAddIn.Application.ActiveDocument.Select();...
0
4196
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?

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.