Slow for-Loop in 3dsmax 2017

mail
Advocate

Slow for-Loop in 3dsmax 2017

mail
Advocate
Advocate

Just a headsup for members of this forum that you might want to check the performance of any scripts that make heavy use of loops before upgrading to 2017.

 

It's been raised on the main forum and on cgtalk that the for-loop is 2+ times slower than in 2016. ( in retrospect I should have created the original thread on this forum)

 

Threads here :

http://forums.cgsociety.org/showthread.php?f=98&t=1359224

http://forums.autodesk.com/t5/3ds-max-3ds-max-design-general/3ds-max-2017-w-sp1-almost-useable-but-n...

Patrick Macdonald
Lighting TD
http://patrick.reformstudios.com

Developer of Mission Control , the spreadsheet editor for 3ds Max
http://mcontrol.reformstudios.com
0 Likes
Reply
Accepted solutions (1)
3,076 Views
18 Replies
Replies (18)

kevinvandecar
Community Manager
Community Manager

Hi Patrick,

 

I also saw similar results, but given that the loop is not doing anything, it's hard to say it is significantly slower. For example, on my machine the 1 million loop takes .489 second on 2017, and .260 second on 2016, so neither one is taking a significant amount of time for the looping itself.

 

But to see if there was a reason, I discussed this with our engineering team, and turns out this is intentional and was evaluated to be a benign performance issue, but added stability and improved error handling. The difference in this case, is due to new overhead per loop iteration that was added in 2017. In the internal implementation, what used to be a pair of inlined push/pop methods is now handled by an object being created and destroyed. Yes, there is a small amount of overhead due to this, but based on real tests the hit is insignificant compared to any operations that might be run inside the loop.

 

The reported results seem “big” because almost nothing else is going on, but as soon as you start doing actual work within the loop, this additional overhead should become insignificant.

 

For 3ds Max 2017, almost all the internal implementation of mxs push/pop code was replaced with class instances that do these operations in their ctor/dtors. This ensures that all code is doing things correctly, and that the code is exception safe. This leads us to increased stability and error handling.

 

Please let us know if you feel there are other performance problems not related to the actual looping code. Again, when testing these areas, we did not see any significant impact for real-world operations (ie. for looping code, the operations being performed are carried out in basically the same amount of time when adding the slight overhead of the 2017 changes).

 

hope it helps,

kevin

 

 


Kevin Vandecar
Developer Technical Services
Autodesk Developer Network



mail
Advocate
Advocate

Hi Kevin,

Thanks for looking in to this for me. I think I owe you guys an apology for jumping the gun on this one. You are quite right that the performance hit is insignificant in real world applications. The script I was working on showed a serious drop in performance when run in max 2017 and initial testing flagged this up as a possible cause. With further analysis I discovered some horrific code that I had failed to clean up ; I was using a try()catch() within a ui loop to prevent exceptions on an execute() that wasn't adequately formed and was triggering exceptions on each loop, thus triggering the catch()!

 

As this bit of code simply shouldn't exist you can ignore this issue, but I did notice that 2017 took far longer to handle this try(execute("garbage code"))catch() code. 

 

Please pass on my thanks to the engineering team for responding with such a detailed response, and for the optimisation! 

Cheers

p.

Patrick Macdonald
Lighting TD
http://patrick.reformstudios.com

Developer of Mission Control , the spreadsheet editor for 3ds Max
http://mcontrol.reformstudios.com
0 Likes

Swordslayer
Advisor
Advisor

Yet the slight overhead doesn't translate to 'basically the same amount of time' but for a 1.2 to 1.5x greater execution time in general case (with well-written real-world code and times in seconds, not milliseconds) and even more than 3 times slower execution when there are variables changed from a different scope (still well-written code with no issues) - see this post and others in the thread.

 

Don't get me wrong, I appreciate the benefits, it's just that I now have to go back and test my old code, try and identify the scripts that are two-odd times slower and try to do something about it. And I really don't want to use and abuse a while loop in place of a for loop just 'cause it might be twice as fast now...

Btw. it would be nice if we could continue the discussion in the cgsociety thread instead as autodesk forums are kinda PITA, I don't mind them being slow but in 5 in 7 browsers I tried (vivaldi, safari, firefox on mac, waterfox on windows - old firefox and edge were working ok), the rich text formatting tools (as well as the html tab) didn't work and I couldn't view post listing, only thread contents - anectodal evidence, but I don't think I'm the only one experiencing this... and people are commenting there and no one comments here.

0 Likes

Swordslayer
Advisor
Advisor

As an example, here's the difference when working with a 1M mesh in 2016 and 2017:

 

 

(
	local obj = convertToPoly (Plane lengthSegs:1000 widthSegs:1000)
	st = timeStamp(); sh = heapFree

	local selectedVerts = polyop.getVertSelection obj

	for i = 1 to 100 do
		for j in selectedVerts do
		(
			/* let's assume we do some stuff here */
		)

	format "time:% ram:%\n" (timeStamp() - st) (sh - heapFree)
)

It's fairly normal production-ready code and although the bitarray contents might change, for example discarding verts that have already been processed, this bitarray is already empty (it's .numberset is zero, it's count is and always will be 1M). Bitarrays are great for that as you can easily subtract from them so I'm not quite ready to give up using them and start converting any bigger returned bitarray to array. Now for the timing results:

 

 

Max 2016: time:696 ram:248L
Max 2017: time:8734 ram:264L

 

That's almost nine seconds in 2017 vs. less than a second in 2016 - not what I would call 'basically the same amount of time' (in this particular instance, it's 12.5 as much time to save you the calculations).

0 Likes

spacefrog_
Advisor
Advisor

The bitarray issue/slowdown is indeed a serious thing , and i can't imagine that this is only because of internal code safety improvements with Max2017

There has to be some deeper issue been introduced with the changes which certainly show with the slowdown factor of >10x


Josef Wienerroither
Software Developer & 3d Artist Hybrid
0 Likes

mail
Advocate
Advocate

Just to chip in again, it might also be worth looking at the performance of failed try()catch() statements. 

I appreciate that these are perhaps NEVER expected to be used in final code, but in some circumstances it may be necessary for expediancy... maybe not! 

 

There is definately a huge performance drop between 2016 and 2017 where I've had try()catch() statements excepting and calling the catch() statement. 

 

I am now going through my code and removing all try()catch()'s as I appreciate they should be removed, but it's a shame that they now introduce such a performance hit. 

Patrick Macdonald
Lighting TD
http://patrick.reformstudios.com

Developer of Mission Control , the spreadsheet editor for 3ds Max
http://mcontrol.reformstudios.com
0 Likes

kevinvandecar
Community Manager
Community Manager
Accepted solution

Hi Guys, a little more information here... Seems a lot of changes came to 2017 MAXScript. Another area that was touched was the exception handling mechanism. Now, the complete mxs callstack is captured at the time the exception occurs. Previously, each level of the mxs callstack was captured as we backed out through the call stack.  Because we are capturing the complete call stack, in some cases we capture more levels than previously. If those levels contained lots of local variables, or the values in the local variables contain lots of values, this capture can take longer that it took in 2016.  The case where this has the largest impact is with code looking like:  try(…expression…)catch(). Previously, the callstack capture would end at this point, but now the stack levels above this are captured. This is particularly bad because the try/catch is just for eating the exception and we don’t care about the callstack capture. But, we don’t know whether in the catch the user is calling getCurrentExceptionStackTrace(), so we have to capture the stack.

 

We introduced the ‘MXSCallstackCaptureEnabled’ context to help with this type of case.  When in this context, the call stack is not captured if an exception is thrown. An example usage would be:

 

try with MXSCallstackCaptureEnabled off (setproperty obj #prop val)

catch() -- just eat any errors

 

I would suggest to review this section in docs about the MXSCallstackCaptureEnabled:

http://help.autodesk.com/view/3DSMAX/2017/ENU/?guid=__files_GUID_F2315A09_440B_4EAE_8873_F27265CDB66...

 

Also note there is a "what's new in MAXScript 2017" here:

http://help.autodesk.com/view/3DSMAX/2017/ENU/?guid=__files_GUID_88FE9C40_FDC0_4858_9675_493A9546DF0...

 

I would not remove all try/catch, because they are meant to be used for error handling, but I would be careful about the complexity of the code contained within the block... maybe break it down into smaller try/catch blocks could help. And of course use the new MXSCallstackCaptureEnabled option when appropriate.

 

hope it helps,

kevin

 


Kevin Vandecar
Developer Technical Services
Autodesk Developer Network



mail
Advocate
Advocate

Thanks for the detailed reponse again Kevin; much appreciated! I think that clears up my understanding of the issue as well as providing a decent solution.

Thanks!

p.

Patrick Macdonald
Lighting TD
http://patrick.reformstudios.com

Developer of Mission Control , the spreadsheet editor for 3ds Max
http://mcontrol.reformstudios.com
0 Likes

Swordslayer
Advisor
Advisor
I would not mark that as a solution to the thread, try-catch has nothing to do with with the slowness of iterating arrays/bitarrays, everything's described in the helpfile (well, the 'what's new' section is the first thing I read as soon as new helpfile is available for download, I am well aware of this - and as I haven't used a try-catch in the last seven years anywhere where it would matter, I won't be using it anyway). I don't need a solution for the slow bitarray iterating now, just say 'we are now aware of it and a fix is in the works (or scheduled, whatever'.
0 Likes

mail
Advocate
Advocate

Sorry, you are quite right. I shouldn't have clicked the solved button! (mods : can you unsolve this issue?)

Further to that, I've thought a bit more about this implementation, and it seems a bit odd that the new stack trace feature was an opt-out rather than opt-in feature... surely this will cause havoc with legacy scripts and require much rewriting to negate the slowdown.

 

Surely, users only need the new stack-trace feature when developing, so the new feature should only be necessary for new scripts during development; eg a single toggle at the beginning and end of the script to enable then disable the more detailed stack-trace would be a better approach as the stack-trace could be disabled entirely when the script is released in the wild giving the code a little speed boost in the process.

 

The way it has been implemented has the potential to render hundreds of scripts unusably slow.

 

Patrick Macdonald
Lighting TD
http://patrick.reformstudios.com

Developer of Mission Control , the spreadsheet editor for 3ds Max
http://mcontrol.reformstudios.com
0 Likes

Swordslayer
Advisor
Advisor
Although I kind of agree that within try-catch operations the MXSCallstackCaptureEnabled context could be implicitly off, the 'hundreds of scripts' is a hyperbole, it would have to be a really badly written script to suffer from this. Apart from disableRefMsgs() / enableRefMsgs() pair which needs to be executed no matter what happens (and that usually only needs to be done once during the runtime of the script) and for destroying global rollout dialogs which is now kind of an idiom for its convenience (and I don't see anyone cdestroying more than a few rollouts either), where else would you use it in production code?
0 Likes

mail
Advocate
Advocate

Fair enough. I've been guilty of using try/catch in lieu of correctly handling badly cast variables in the past, so I am sure others have too.

I think my point is that given the change can hit performance, and isn't strictly required for a correctly functioning script (unless I am missing something), then the default state should be as though disableRefMsgs is active. Only when a script is being developed would you want to enableRefMsgs to help debug your code.

But yes, this is a minor issue given the performance issue only hits code that is disgracefully poor in the first place 🙂

 

Patrick Macdonald
Lighting TD
http://patrick.reformstudios.com

Developer of Mission Control , the spreadsheet editor for 3ds Max
http://mcontrol.reformstudios.com
0 Likes

kevinvandecar
Community Manager
Community Manager

Hi Vojtech,

 

I think the solution for this thread is OK here because it started mainly as "slow for-loop". We also answered the "exception" issue as a bonus. 🙂

 

After wading through the discussion at cgsociety, I think the last thing to deal with is the "iterating arrays/bitarrays" issue that you also mentioned here. I ran that issue by our developers, and one guy did some testing with automation test scripts he had using much array and bitarray using a code performance analysis tool (VTune). In the end, yes, it was slower, but his impression was that it had to do with all the other changes and not anything directly with array/bitarray.

 

So, if you have any examples that demonstrate what you feel is a significant performance issue, feel free to pass it over and I will give to engineering for more review.

 

hope it helps,

thanks,

kevin

 


Kevin Vandecar
Developer Technical Services
Autodesk Developer Network



Swordslayer
Advisor
Advisor

Hi, see the previous page, this post. Note that all it gets to get from half a second in max 2016 (time that you wouldn't notice) to close to nine seconds (time that would leave you counting to ten). Is to use any polyop method that returns a bitarray on big enough mesh (and let's be honest, big meshes are usually the reason I'm using maxscript to begin with) - iterating the bitarray, the for j in selectedVerts do for loop, is where the slowdown happens. For another real-world code, see this post #48 in the original thread. The GetElements function there uses bitarrays, if you rewrite it to use arrays instead, the speed difference factor between versions is the usual 1.5, with bitarrays it is 4 - and the performance gap gets wider as the bitarray count increases - the time increase in 2016 is logarithmic and in max 2017 it's linear.

 

I don't really care what causes it, this shouldn't happen.

mail
Advocate
Advocate

To return to the try()catch() performance degredation, here's an example of where it's required, and where the use of "with MXSCallstackCaptureEnabled off" is inadequate. 

 

Where I'm iterating over all the scene objects and modifiers and getting or setting a parameter, I can usually use "hasproperty", but for some classes this doesn't work; for example the cloth modifier.

 

Create a box and add a cloth modifier.

m=$.modifiers[1]

hasproperty m "bias"

getproperty m "bias"

 

As you can see, even though hasproperty returns true, when I attempt to get the property, I get an exception. 

My script aims to work without hard-coding every class property, so it is essential that I can use maxscript to a) list the class properties, then b) check that an object has that property before c) getting or setting that property. 

 

As the behaviour of some classes(maybe only the cloth modifier, but maybe others) does not allow me to reliably check for the existance of a property, I have to set get/setproperty within a try/catch. 

 

So... this was all well and good in 3dsmax versions up to 2017 as try/catch doesn't degrade performance too much. In 2017 I can't use try/catch anymore, so I either have to hard-code a test for invalid classes (something I can't do till I actually stumble across this bug), or I use the new MXSCallstackCaptureEnabled method to bring the try/catch performance closer to what it was in 2016 and before.

 

I would do this, but this now introduces code that isn't supported in versions prior to 2017 so I am now forced to add another test to return the max version and to run a different copy of the same chunk of code depending on the max version. This does not seem like a good place to end up!

 

If the new stack-trace method was disabled by default, none of this would be an issue, and where I was developing in a known 2017 environment, I would be able to enable the enhanced stack-trace as required. Assuming I am not missing another far easier approach to circumvent these issues, can I request that you pass this back to your developers and ask them to consider reverting to the original stack-trace behaviour with the new behaviour only active when explicitly called. 

 

Patrick Macdonald
Lighting TD
http://patrick.reformstudios.com

Developer of Mission Control , the spreadsheet editor for 3ds Max
http://mcontrol.reformstudios.com
0 Likes

mail
Advocate
Advocate

Here's an example. If I am iterating over all scene classes and getting properties, I need to check the property exists before calling it. This works most of the time, but there are some exceptions in which case the only way I can do this without a hard-coded list of exceptions is to use try/catch.
As my script doesn't know what classes and their properties to expect, I need to be able to programatically discard invalid parameters on the fly.

Create a box, add a cloth modifier

m=$.modifiers[1]
hasproperty m "bias"
getproperty m "bias"

Patrick Macdonald
Lighting TD
http://patrick.reformstudios.com

Developer of Mission Control , the spreadsheet editor for 3ds Max
http://mcontrol.reformstudios.com
0 Likes

mail
Advocate
Advocate
Actually, it looks like I can't even run different code for older versions of max with this workaround :

if ((maxVersion())[1] / 1000) > 18 then (with MXSCallstackCaptureEnabled off try(format "test")catch())

This fails in max2016.
Patrick Macdonald
Lighting TD
http://patrick.reformstudios.com

Developer of Mission Control , the spreadsheet editor for 3ds Max
http://mcontrol.reformstudios.com
0 Likes

Swordslayer
Advisor
Advisor

Ad 1) that's what isProperty is for, hasProperty gives you properties of the class no matter if they are currently accessible or not (which is most useful when you are calling class constructor), isProperty tries to access the property silently and tells you if it succeeded (which also means it will work with inherited properties). As a side note, I hope you don't use $ in the script itself.

 

Ad 2) bummer, the parser doesn't know that context which means there would need to be a different version of the script for 2017+ if you insisted on using try-catch and this context.

 

Anyway, this doesn't belong in this thread, make a new thread for this.

0 Likes

Type a product name

______
icon-svg-close-thick

Cookie preferences

Your privacy is important to us and so is an optimal experience. To help us customize information and build applications, we collect data about your use of this site.

May we collect and use your data?

Learn more about the Third Party Services we use and our Privacy Statement.

Strictly necessary – required for our site to work and to provide services to you

These cookies allow us to record your preferences or login information, respond to your requests or fulfill items in your shopping cart.

Improve your experience – allows us to show you what is relevant to you

These cookies enable us to provide enhanced functionality and personalization. They may be set by us or by third party providers whose services we use to deliver information and experiences tailored to you. If you do not allow these cookies, some or all of these services may not be available for you.

Customize your advertising – permits us to offer targeted advertising to you

These cookies collect data about you based on your activities and interests in order to show you relevant ads and to track effectiveness. By collecting this data, the ads you see will be more tailored to your interests. If you do not allow these cookies, you will experience less targeted advertising.

icon-svg-close-thick

THIRD PARTY SERVICES

Learn more about the Third-Party Services we use in each category, and how we use the data we collect from you online.

icon-svg-hide-thick

icon-svg-show-thick

Strictly necessary – required for our site to work and to provide services to you

Qualtrics
We use Qualtrics to let you give us feedback via surveys or online forms. You may be randomly selected to participate in a survey, or you can actively decide to give us feedback. We collect data to better understand what actions you took before filling out a survey. This helps us troubleshoot issues you may have experienced. Qualtrics Privacy Policy
Akamai mPulse
We use Akamai mPulse to collect data about your behavior on our sites. This may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, your IP address or device ID, and your Autodesk ID. We use this data to measure our site performance and evaluate the ease of your online experience, so we can enhance our features. We also use advanced analytics methods to optimize your experience with email, customer support, and sales. Akamai mPulse Privacy Policy
Digital River
We use Digital River to collect data about your behavior on our sites. This may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, your IP address or device ID, and your Autodesk ID. We use this data to measure our site performance and evaluate the ease of your online experience, so we can enhance our features. We also use advanced analytics methods to optimize your experience with email, customer support, and sales. Digital River Privacy Policy
Dynatrace
We use Dynatrace to collect data about your behavior on our sites. This may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, your IP address or device ID, and your Autodesk ID. We use this data to measure our site performance and evaluate the ease of your online experience, so we can enhance our features. We also use advanced analytics methods to optimize your experience with email, customer support, and sales. Dynatrace Privacy Policy
Khoros
We use Khoros to collect data about your behavior on our sites. This may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, your IP address or device ID, and your Autodesk ID. We use this data to measure our site performance and evaluate the ease of your online experience, so we can enhance our features. We also use advanced analytics methods to optimize your experience with email, customer support, and sales. Khoros Privacy Policy
Launch Darkly
We use Launch Darkly to collect data about your behavior on our sites. This may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, your IP address or device ID, and your Autodesk ID. We use this data to measure our site performance and evaluate the ease of your online experience, so we can enhance our features. We also use advanced analytics methods to optimize your experience with email, customer support, and sales. Launch Darkly Privacy Policy
New Relic
We use New Relic to collect data about your behavior on our sites. This may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, your IP address or device ID, and your Autodesk ID. We use this data to measure our site performance and evaluate the ease of your online experience, so we can enhance our features. We also use advanced analytics methods to optimize your experience with email, customer support, and sales. New Relic Privacy Policy
Salesforce Live Agent
We use Salesforce Live Agent to collect data about your behavior on our sites. This may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, your IP address or device ID, and your Autodesk ID. We use this data to measure our site performance and evaluate the ease of your online experience, so we can enhance our features. We also use advanced analytics methods to optimize your experience with email, customer support, and sales. Salesforce Live Agent Privacy Policy
Wistia
We use Wistia to collect data about your behavior on our sites. This may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, your IP address or device ID, and your Autodesk ID. We use this data to measure our site performance and evaluate the ease of your online experience, so we can enhance our features. We also use advanced analytics methods to optimize your experience with email, customer support, and sales. Wistia Privacy Policy
Tealium
We use Tealium to collect data about your behavior on our sites. This may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. We use this data to measure our site performance and evaluate the ease of your online experience, so we can enhance our features. We also use advanced analytics methods to optimize your experience with email, customer support, and sales. Tealium Privacy Policy
Upsellit
We use Upsellit to collect data about your behavior on our sites. This may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. We use this data to measure our site performance and evaluate the ease of your online experience, so we can enhance our features. We also use advanced analytics methods to optimize your experience with email, customer support, and sales. Upsellit Privacy Policy
CJ Affiliates
We use CJ Affiliates to collect data about your behavior on our sites. This may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. We use this data to measure our site performance and evaluate the ease of your online experience, so we can enhance our features. We also use advanced analytics methods to optimize your experience with email, customer support, and sales. CJ Affiliates Privacy Policy
Commission Factory
We use Commission Factory to collect data about your behavior on our sites. This may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. We use this data to measure our site performance and evaluate the ease of your online experience, so we can enhance our features. We also use advanced analytics methods to optimize your experience with email, customer support, and sales. Commission Factory Privacy Policy
Google Analytics (Strictly Necessary)
We use Google Analytics (Strictly Necessary) to collect data about your behavior on our sites. This may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, your IP address or device ID, and your Autodesk ID. We use this data to measure our site performance and evaluate the ease of your online experience, so we can enhance our features. We also use advanced analytics methods to optimize your experience with email, customer support, and sales. Google Analytics (Strictly Necessary) Privacy Policy
Typepad Stats
We use Typepad Stats to collect data about your behaviour on our sites. This may include pages you’ve visited. We use this data to measure our site performance and evaluate the ease of your online experience, so we can enhance our platform to provide the most relevant content. This allows us to enhance your overall user experience. Typepad Stats Privacy Policy
Geo Targetly
We use Geo Targetly to direct website visitors to the most appropriate web page and/or serve tailored content based on their location. Geo Targetly uses the IP address of a website visitor to determine the approximate location of the visitor’s device. This helps ensure that the visitor views content in their (most likely) local language.Geo Targetly Privacy Policy
SpeedCurve
We use SpeedCurve to monitor and measure the performance of your website experience by measuring web page load times as well as the responsiveness of subsequent elements such as images, scripts, and text.SpeedCurve Privacy Policy
Qualified
Qualified is the Autodesk Live Chat agent platform. This platform provides services to allow our customers to communicate in real-time with Autodesk support. We may collect unique ID for specific browser sessions during a chat. Qualified Privacy Policy

icon-svg-hide-thick

icon-svg-show-thick

Improve your experience – allows us to show you what is relevant to you

Google Optimize
We use Google Optimize to test new features on our sites and customize your experience of these features. To do this, we collect behavioral data while you’re on our sites. This data may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, your IP address or device ID, your Autodesk ID, and others. You may experience a different version of our sites based on feature testing, or view personalized content based on your visitor attributes. Google Optimize Privacy Policy
ClickTale
We use ClickTale to better understand where you may encounter difficulties with our sites. We use session recording to help us see how you interact with our sites, including any elements on our pages. Your Personally Identifiable Information is masked and is not collected. ClickTale Privacy Policy
OneSignal
We use OneSignal to deploy digital advertising on sites supported by OneSignal. Ads are based on both OneSignal data and behavioral data that we collect while you’re on our sites. The data we collect may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. This information may be combined with data that OneSignal has collected from you. We use the data that we provide to OneSignal to better customize your digital advertising experience and present you with more relevant ads. OneSignal Privacy Policy
Optimizely
We use Optimizely to test new features on our sites and customize your experience of these features. To do this, we collect behavioral data while you’re on our sites. This data may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, your IP address or device ID, your Autodesk ID, and others. You may experience a different version of our sites based on feature testing, or view personalized content based on your visitor attributes. Optimizely Privacy Policy
Amplitude
We use Amplitude to test new features on our sites and customize your experience of these features. To do this, we collect behavioral data while you’re on our sites. This data may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, your IP address or device ID, your Autodesk ID, and others. You may experience a different version of our sites based on feature testing, or view personalized content based on your visitor attributes. Amplitude Privacy Policy
Snowplow
We use Snowplow to collect data about your behavior on our sites. This may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, your IP address or device ID, and your Autodesk ID. We use this data to measure our site performance and evaluate the ease of your online experience, so we can enhance our features. We also use advanced analytics methods to optimize your experience with email, customer support, and sales. Snowplow Privacy Policy
UserVoice
We use UserVoice to collect data about your behaviour on our sites. This may include pages you’ve visited. We use this data to measure our site performance and evaluate the ease of your online experience, so we can enhance our platform to provide the most relevant content. This allows us to enhance your overall user experience. UserVoice Privacy Policy
Clearbit
Clearbit allows real-time data enrichment to provide a personalized and relevant experience to our customers. The data we collect may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID.Clearbit Privacy Policy
YouTube
YouTube is a video sharing platform which allows users to view and share embedded videos on our websites. YouTube provides viewership metrics on video performance. YouTube Privacy Policy

icon-svg-hide-thick

icon-svg-show-thick

Customize your advertising – permits us to offer targeted advertising to you

Adobe Analytics
We use Adobe Analytics to collect data about your behavior on our sites. This may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, your IP address or device ID, and your Autodesk ID. We use this data to measure our site performance and evaluate the ease of your online experience, so we can enhance our features. We also use advanced analytics methods to optimize your experience with email, customer support, and sales. Adobe Analytics Privacy Policy
Google Analytics (Web Analytics)
We use Google Analytics (Web Analytics) to collect data about your behavior on our sites. This may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. We use this data to measure our site performance and evaluate the ease of your online experience, so we can enhance our features. We also use advanced analytics methods to optimize your experience with email, customer support, and sales. Google Analytics (Web Analytics) Privacy Policy
AdWords
We use AdWords to deploy digital advertising on sites supported by AdWords. Ads are based on both AdWords data and behavioral data that we collect while you’re on our sites. The data we collect may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. This information may be combined with data that AdWords has collected from you. We use the data that we provide to AdWords to better customize your digital advertising experience and present you with more relevant ads. AdWords Privacy Policy
Marketo
We use Marketo to send you more timely and relevant email content. To do this, we collect data about your online behavior and your interaction with the emails we send. Data collected may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, your IP address or device ID, email open rates, links clicked, and others. We may combine this data with data collected from other sources to offer you improved sales or customer service experiences, as well as more relevant content based on advanced analytics processing. Marketo Privacy Policy
Doubleclick
We use Doubleclick to deploy digital advertising on sites supported by Doubleclick. Ads are based on both Doubleclick data and behavioral data that we collect while you’re on our sites. The data we collect may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. This information may be combined with data that Doubleclick has collected from you. We use the data that we provide to Doubleclick to better customize your digital advertising experience and present you with more relevant ads. Doubleclick Privacy Policy
HubSpot
We use HubSpot to send you more timely and relevant email content. To do this, we collect data about your online behavior and your interaction with the emails we send. Data collected may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, your IP address or device ID, email open rates, links clicked, and others. HubSpot Privacy Policy
Twitter
We use Twitter to deploy digital advertising on sites supported by Twitter. Ads are based on both Twitter data and behavioral data that we collect while you’re on our sites. The data we collect may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. This information may be combined with data that Twitter has collected from you. We use the data that we provide to Twitter to better customize your digital advertising experience and present you with more relevant ads. Twitter Privacy Policy
Facebook
We use Facebook to deploy digital advertising on sites supported by Facebook. Ads are based on both Facebook data and behavioral data that we collect while you’re on our sites. The data we collect may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. This information may be combined with data that Facebook has collected from you. We use the data that we provide to Facebook to better customize your digital advertising experience and present you with more relevant ads. Facebook Privacy Policy
LinkedIn
We use LinkedIn to deploy digital advertising on sites supported by LinkedIn. Ads are based on both LinkedIn data and behavioral data that we collect while you’re on our sites. The data we collect may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. This information may be combined with data that LinkedIn has collected from you. We use the data that we provide to LinkedIn to better customize your digital advertising experience and present you with more relevant ads. LinkedIn Privacy Policy
Yahoo! Japan
We use Yahoo! Japan to deploy digital advertising on sites supported by Yahoo! Japan. Ads are based on both Yahoo! Japan data and behavioral data that we collect while you’re on our sites. The data we collect may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. This information may be combined with data that Yahoo! Japan has collected from you. We use the data that we provide to Yahoo! Japan to better customize your digital advertising experience and present you with more relevant ads. Yahoo! Japan Privacy Policy
Naver
We use Naver to deploy digital advertising on sites supported by Naver. Ads are based on both Naver data and behavioral data that we collect while you’re on our sites. The data we collect may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. This information may be combined with data that Naver has collected from you. We use the data that we provide to Naver to better customize your digital advertising experience and present you with more relevant ads. Naver Privacy Policy
Quantcast
We use Quantcast to deploy digital advertising on sites supported by Quantcast. Ads are based on both Quantcast data and behavioral data that we collect while you’re on our sites. The data we collect may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. This information may be combined with data that Quantcast has collected from you. We use the data that we provide to Quantcast to better customize your digital advertising experience and present you with more relevant ads. Quantcast Privacy Policy
Call Tracking
We use Call Tracking to provide customized phone numbers for our campaigns. This gives you faster access to our agents and helps us more accurately evaluate our performance. We may collect data about your behavior on our sites based on the phone number provided. Call Tracking Privacy Policy
Wunderkind
We use Wunderkind to deploy digital advertising on sites supported by Wunderkind. Ads are based on both Wunderkind data and behavioral data that we collect while you’re on our sites. The data we collect may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. This information may be combined with data that Wunderkind has collected from you. We use the data that we provide to Wunderkind to better customize your digital advertising experience and present you with more relevant ads. Wunderkind Privacy Policy
ADC Media
We use ADC Media to deploy digital advertising on sites supported by ADC Media. Ads are based on both ADC Media data and behavioral data that we collect while you’re on our sites. The data we collect may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. This information may be combined with data that ADC Media has collected from you. We use the data that we provide to ADC Media to better customize your digital advertising experience and present you with more relevant ads. ADC Media Privacy Policy
AgrantSEM
We use AgrantSEM to deploy digital advertising on sites supported by AgrantSEM. Ads are based on both AgrantSEM data and behavioral data that we collect while you’re on our sites. The data we collect may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. This information may be combined with data that AgrantSEM has collected from you. We use the data that we provide to AgrantSEM to better customize your digital advertising experience and present you with more relevant ads. AgrantSEM Privacy Policy
Bidtellect
We use Bidtellect to deploy digital advertising on sites supported by Bidtellect. Ads are based on both Bidtellect data and behavioral data that we collect while you’re on our sites. The data we collect may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. This information may be combined with data that Bidtellect has collected from you. We use the data that we provide to Bidtellect to better customize your digital advertising experience and present you with more relevant ads. Bidtellect Privacy Policy
Bing
We use Bing to deploy digital advertising on sites supported by Bing. Ads are based on both Bing data and behavioral data that we collect while you’re on our sites. The data we collect may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. This information may be combined with data that Bing has collected from you. We use the data that we provide to Bing to better customize your digital advertising experience and present you with more relevant ads. Bing Privacy Policy
G2Crowd
We use G2Crowd to deploy digital advertising on sites supported by G2Crowd. Ads are based on both G2Crowd data and behavioral data that we collect while you’re on our sites. The data we collect may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. This information may be combined with data that G2Crowd has collected from you. We use the data that we provide to G2Crowd to better customize your digital advertising experience and present you with more relevant ads. G2Crowd Privacy Policy
NMPI Display
We use NMPI Display to deploy digital advertising on sites supported by NMPI Display. Ads are based on both NMPI Display data and behavioral data that we collect while you’re on our sites. The data we collect may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. This information may be combined with data that NMPI Display has collected from you. We use the data that we provide to NMPI Display to better customize your digital advertising experience and present you with more relevant ads. NMPI Display Privacy Policy
VK
We use VK to deploy digital advertising on sites supported by VK. Ads are based on both VK data and behavioral data that we collect while you’re on our sites. The data we collect may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. This information may be combined with data that VK has collected from you. We use the data that we provide to VK to better customize your digital advertising experience and present you with more relevant ads. VK Privacy Policy
Adobe Target
We use Adobe Target to test new features on our sites and customize your experience of these features. To do this, we collect behavioral data while you’re on our sites. This data may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, your IP address or device ID, your Autodesk ID, and others. You may experience a different version of our sites based on feature testing, or view personalized content based on your visitor attributes. Adobe Target Privacy Policy
Google Analytics (Advertising)
We use Google Analytics (Advertising) to deploy digital advertising on sites supported by Google Analytics (Advertising). Ads are based on both Google Analytics (Advertising) data and behavioral data that we collect while you’re on our sites. The data we collect may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. This information may be combined with data that Google Analytics (Advertising) has collected from you. We use the data that we provide to Google Analytics (Advertising) to better customize your digital advertising experience and present you with more relevant ads. Google Analytics (Advertising) Privacy Policy
Trendkite
We use Trendkite to deploy digital advertising on sites supported by Trendkite. Ads are based on both Trendkite data and behavioral data that we collect while you’re on our sites. The data we collect may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. This information may be combined with data that Trendkite has collected from you. We use the data that we provide to Trendkite to better customize your digital advertising experience and present you with more relevant ads. Trendkite Privacy Policy
Hotjar
We use Hotjar to deploy digital advertising on sites supported by Hotjar. Ads are based on both Hotjar data and behavioral data that we collect while you’re on our sites. The data we collect may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. This information may be combined with data that Hotjar has collected from you. We use the data that we provide to Hotjar to better customize your digital advertising experience and present you with more relevant ads. Hotjar Privacy Policy
6 Sense
We use 6 Sense to deploy digital advertising on sites supported by 6 Sense. Ads are based on both 6 Sense data and behavioral data that we collect while you’re on our sites. The data we collect may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. This information may be combined with data that 6 Sense has collected from you. We use the data that we provide to 6 Sense to better customize your digital advertising experience and present you with more relevant ads. 6 Sense Privacy Policy
Terminus
We use Terminus to deploy digital advertising on sites supported by Terminus. Ads are based on both Terminus data and behavioral data that we collect while you’re on our sites. The data we collect may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. This information may be combined with data that Terminus has collected from you. We use the data that we provide to Terminus to better customize your digital advertising experience and present you with more relevant ads. Terminus Privacy Policy
StackAdapt
We use StackAdapt to deploy digital advertising on sites supported by StackAdapt. Ads are based on both StackAdapt data and behavioral data that we collect while you’re on our sites. The data we collect may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. This information may be combined with data that StackAdapt has collected from you. We use the data that we provide to StackAdapt to better customize your digital advertising experience and present you with more relevant ads. StackAdapt Privacy Policy
The Trade Desk
We use The Trade Desk to deploy digital advertising on sites supported by The Trade Desk. Ads are based on both The Trade Desk data and behavioral data that we collect while you’re on our sites. The data we collect may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. This information may be combined with data that The Trade Desk has collected from you. We use the data that we provide to The Trade Desk to better customize your digital advertising experience and present you with more relevant ads. The Trade Desk Privacy Policy
RollWorks
We use RollWorks to deploy digital advertising on sites supported by RollWorks. Ads are based on both RollWorks data and behavioral data that we collect while you’re on our sites. The data we collect may include pages you’ve visited, trials you’ve initiated, videos you’ve played, purchases you’ve made, and your IP address or device ID. This information may be combined with data that RollWorks has collected from you. We use the data that we provide to RollWorks to better customize your digital advertising experience and present you with more relevant ads. RollWorks Privacy Policy

Are you sure you want a less customized experience?

We can access your data only if you select "yes" for the categories on the previous screen. This lets us tailor our marketing so that it's more relevant for you. You can change your settings at any time by visiting our privacy statement

Your experience. Your choice.

We care about your privacy. The data we collect helps us understand how you use our products, what information you might be interested in, and what we can improve to make your engagement with Autodesk more rewarding.

May we collect and use your data to tailor your experience?

Explore the benefits of a customized experience by managing your privacy settings for this site or visit our Privacy Statement to learn more about your options.