<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Plugin languages comparison in Revit API Forum</title>
    <link>https://forums.autodesk.com/t5/revit-api-forum/plugin-languages-comparison/m-p/10730914#M23763</link>
    <description>&lt;P&gt;I ran each sequence of 10 runs for each plugin one after the other, without restarting Revit or my computer in between. I only restarted Revit once after the first run of the VB.NET plugin because I closed Revit by mistake, however it didn't make a really big difference in execution time, so I think it's okay.&lt;/P&gt;</description>
    <pubDate>Tue, 02 Nov 2021 18:32:40 GMT</pubDate>
    <dc:creator>jeroen.van.halderen</dc:creator>
    <dc:date>2021-11-02T18:32:40Z</dc:date>
    <item>
      <title>Plugin languages comparison</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/plugin-languages-comparison/m-p/10618816#M23757</link>
      <description>&lt;P&gt;Dear fellow developers,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;While I was learning some programming techniques I heard somewhere that C++ is the fastest language out there, so I decided to do a test to see which of the three languages you can use to write a Revit plugin is the fastest. During my test it occurred to me that, because the Revit API is managed, the C++ implementation you can use to write a Revit plugin is considerably slower than native C++.&lt;/P&gt;&lt;P&gt;My test was to create 1000 modelcurves in Revit, the result are as follows:&lt;/P&gt;&lt;P&gt;With visual C++ it took 4 seconds, 733 milliseconds and 9619 ticks,&lt;/P&gt;&lt;P&gt;With C# it took 7 seconds,&amp;nbsp; 989 milliseconds and 4320 ticks,&lt;/P&gt;&lt;P&gt;With VB.NET it took 5 seconds, 16 milliseconds and 3316 ticks.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The code for each of the three plugins is as follows:&lt;/P&gt;&lt;P&gt;Visual C++:&lt;/P&gt;&lt;P&gt;-Header:&lt;/P&gt;&lt;LI-CODE lang="general"&gt;#pragma once

using namespace System;

namespace HelloRevitCpp {
	[Autodesk::Revit::Attributes::TransactionAttribute(
		Autodesk::Revit::Attributes::TransactionMode::Manual)]

	[Autodesk::Revit::Attributes::RegenerationAttribute(
		Autodesk::Revit::Attributes::RegenerationOption::Manual)]
	public ref class Command
		: Autodesk::Revit::UI::IExternalCommand
	{
	public:
		virtual Autodesk::Revit::UI::Result Execute(
			Autodesk::Revit::UI::ExternalCommandData^ commandData,
			System::String^% message,
			Autodesk::Revit::DB::ElementSet^ elements);
	};
}&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;-Main code:&lt;/P&gt;&lt;LI-CODE lang="cpp"&gt;#include "HelloRevitCpp.h"


using namespace Autodesk::Revit::DB;
using namespace Autodesk::Revit::UI;
using namespace HelloRevitCpp;

Result Command::Execute(ExternalCommandData^ commandData, String^% message, ElementSet^ elements) {
	Diagnostics::Stopwatch^ watch = gcnew Diagnostics::Stopwatch();
	watch-&amp;gt;Start();
	Document^ doc = commandData-&amp;gt;Application-&amp;gt;ActiveUIDocument-&amp;gt;Document;
	Plane^ plane = Plane::CreateByNormalAndOrigin(gcnew XYZ(0, 0, 1), gcnew XYZ());
	Transaction trans(doc);
	trans.Start("Test");
	SketchPlane^ sketchPlane = SketchPlane::Create(doc, plane);
	for (int i{ 0 }; i &amp;lt; 1000; ++i) {
		doc-&amp;gt;Create-&amp;gt;NewModelCurve(Line::CreateBound(gcnew XYZ(), gcnew XYZ(i + 1, 0, 0)), sketchPlane);
	}
	trans.Commit();
	watch-&amp;gt;Stop();
	TaskDialog testDialog("Test");
	testDialog.Show("Test", "It took " + watch-&amp;gt;Elapsed.Seconds + " seconds, " + watch-&amp;gt;Elapsed.Milliseconds + " milliseconds and " + watch-&amp;gt;Elapsed.Ticks + " ticks to create 1000 modelcurve");
	return Result::Succeeded;
}&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;C#:&lt;/P&gt;&lt;LI-CODE lang="csharp"&gt;using System.Diagnostics;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;

namespace HelloRevitCS
{
    [Transaction(TransactionMode.Manual)]
    public class Command : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            Stopwatch watch = new Stopwatch();
            watch.Start();
            Document doc = commandData.Application.ActiveUIDocument.Document;
            Plane plane = Plane.CreateByNormalAndOrigin(XYZ.BasisZ, new XYZ());
            Transaction trans = new Transaction(doc);
            trans.Start("Test");
            SketchPlane sketchPlane = SketchPlane.Create(doc, plane);
            for (int i = 0; i &amp;lt; 1000; ++i)
            {
                doc.Create.NewModelCurve(Line.CreateBound(new XYZ(), new XYZ(i + 1, 0, 0)), sketchPlane);
            }
            trans.Commit();
            watch.Stop();
            TaskDialog.Show("Test", "It took " + watch.Elapsed.Seconds + " seconds, " + watch.Elapsed.Milliseconds + " milliseconds and " + watch.Elapsed.Ticks + " ticks to create 1000 modelcurves");
            return Result.Succeeded;
        }
    }
}&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;VB.NET:&lt;/P&gt;&lt;LI-CODE lang="general"&gt;Imports Autodesk.Revit.Attributes
Imports Autodesk.Revit.UI
Imports Autodesk.Revit.DB

&amp;lt;Transaction(TransactionMode.Manual)&amp;gt;
Public Class Command
    Implements IExternalCommand
    Public Function Execute(commandData As ExternalCommandData, ByRef message As String, elements As ElementSet) As Result Implements IExternalCommand.Execute
        Dim watch As Stopwatch = New Stopwatch
        watch.Start()
        Dim doc As Document = commandData.Application.ActiveUIDocument.Document
        Dim plane As Plane = plane.CreateByNormalAndOrigin(XYZ.BasisZ, New XYZ())

        Dim trans As Transaction = New Transaction(doc)
        trans.Start("Test")
        Dim sketchPlane As SketchPlane = SketchPlane.Create(doc, plane)
        For i = 1 To 1000
            doc.Create.NewModelCurve(Line.CreateBound(New XYZ(), New XYZ() + XYZ.BasisY.Multiply(i)), sketchPlane)
        Next
        trans.Commit()
        watch.Stop()
        TaskDialog.Show("Runtimetest", "It took " &amp;amp; watch.Elapsed.Seconds &amp;amp; " seconds, " &amp;amp; watch.Elapsed.Milliseconds &amp;amp; " milliseconds and " &amp;amp; watch.Elapsed.Ticks &amp;amp; " ticks to create 1000 modelcurves")
        Return Result.Succeeded
    End Function
End Class&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 13 Sep 2021 14:38:44 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/plugin-languages-comparison/m-p/10618816#M23757</guid>
      <dc:creator>jeroen.van.halderen</dc:creator>
      <dc:date>2021-09-13T14:38:44Z</dc:date>
    </item>
    <item>
      <title>Re: Plugin languages comparison</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/plugin-languages-comparison/m-p/10620321#M23758</link>
      <description>&lt;P&gt;Interesting comparison&amp;nbsp;&lt;span class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;🙂&lt;/span&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 14 Sep 2021 04:26:52 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/plugin-languages-comparison/m-p/10620321#M23758</guid>
      <dc:creator>sahin.ikbal</dc:creator>
      <dc:date>2021-09-14T04:26:52Z</dc:date>
    </item>
    <item>
      <title>Re: Plugin languages comparison</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/plugin-languages-comparison/m-p/10622681#M23759</link>
      <description>&lt;P&gt;I always knew VB.Net was 2 seconds quicker than C#!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I've never been convinced that such comparisons are truly accurate i.e. was the machine restarted between tests and in the exact same state.&amp;nbsp; There is an amount or graphics caching that goes on I've sometimes noticed the same test conducted has differing results, best to take an average of multiple tests. Especially considering the state of other OS processes and services are constantly changing.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Note that your VB.Net code is not exactly the same as the other two. Your line is heading in the Y direction and you are using XYZ.Multiply rather than the constructor.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Code Revit API in C++?...Never in a million years. Using a managed language is the way to go. You can use managed C++ CLR compliant, so that statement in itself is a bit ambiguous. I guess these choices are based on personal experience. Noticed some RevitAPI code in F# once.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 14 Sep 2021 22:23:08 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/plugin-languages-comparison/m-p/10622681#M23759</guid>
      <dc:creator>RPTHOMAS108</dc:creator>
      <dc:date>2021-09-14T22:23:08Z</dc:date>
    </item>
    <item>
      <title>Re: Plugin languages comparison</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/plugin-languages-comparison/m-p/10624437#M23760</link>
      <description>&lt;P&gt;I know it would have been better to take an average of multiple tests because the state of my machine and maybe even the state of Revit changed between tests, but I didn't have time to do multiple tests when I wrote this post. The results of my little comparison shouldn't be taken as the truth, if you want to know in which programming language your tool runs fastest I would advise to just test it for yourself.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks for pointing out that my VB.NET code isn't quite the same as in the other two languages, I hadn't noticed that yet!&lt;/P&gt;</description>
      <pubDate>Wed, 15 Sep 2021 14:31:21 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/plugin-languages-comparison/m-p/10624437#M23760</guid>
      <dc:creator>jeroen.van.halderen</dc:creator>
      <dc:date>2021-09-15T14:31:21Z</dc:date>
    </item>
    <item>
      <title>Re: Plugin languages comparison</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/plugin-languages-comparison/m-p/10730397#M23761</link>
      <description>&lt;P&gt;Dear fellow developers,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;It took me quite long, but I have found some time to correct the mistake in my VB.NET code pointed out by&amp;nbsp;&lt;a href="https://forums.autodesk.com/t5/user/viewprofilepage/user-id/1035859"&gt;@RPTHOMAS108&lt;/a&gt; and run multiple tests to get a better comparison between the three programming languages.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;First of all, here's the corrected VB.NET code:&lt;/P&gt;&lt;LI-CODE lang="general"&gt;Imports Autodesk.Revit.Attributes
Imports Autodesk.Revit.UI
Imports Autodesk.Revit.DB

&amp;lt;Transaction(TransactionMode.Manual)&amp;gt;
Public Class Command
    Implements IExternalCommand
    Public Function Execute(commandData As ExternalCommandData, ByRef message As String, elements As ElementSet) As Result Implements IExternalCommand.Execute
        Dim watch As Stopwatch = New Stopwatch
        watch.Start()
        Dim doc As Document = commandData.Application.ActiveUIDocument.Document
        Dim plane As Plane = plane.CreateByNormalAndOrigin(XYZ.BasisZ, New XYZ())

        Dim trans As Transaction = New Transaction(doc)
        trans.Start("Test")
        Dim sketchPlane As SketchPlane = SketchPlane.Create(doc, plane)
        For i = 1 To 1000
            doc.Create.NewModelCurve(Line.CreateBound(New XYZ(), New XYZ(0, i, 0)), sketchPlane)
        Next
        trans.Commit()
        watch.Stop()
        TaskDialog.Show("Runtimetest", "It took " &amp;amp; watch.Elapsed.Seconds &amp;amp; " seconds, " &amp;amp; watch.Elapsed.Milliseconds &amp;amp; " milliseconds and " &amp;amp; watch.Elapsed.Ticks &amp;amp; " ticks to create 1000 modelcurves")
        Return Result.Succeeded
    End Function
End Class&lt;/LI-CODE&gt;&lt;P&gt;Secondly, to get an acceptable average testresult I ran each of the three plugins that I made ten times, the results are as follows:&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jeroenvanhalderen_0-1635862186204.png" style="width: 999px;"&gt;&lt;img src="https://forums.autodesk.com/t5/image/serverpage/image-id/984787iD37049406B678AA3/image-size/large?v=v2&amp;amp;px=999" role="button" title="jeroenvanhalderen_0-1635862186204.png" alt="jeroenvanhalderen_0-1635862186204.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;During these tests I had a few programs running in the background, but not more than what I would consider to be normal, so the result should be fairly comparable to what the average Revit user would get.&lt;/P&gt;&lt;P&gt;I hope this helps you in your journey that is learning how to program.&lt;/P&gt;</description>
      <pubDate>Tue, 02 Nov 2021 14:13:22 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/plugin-languages-comparison/m-p/10730397#M23761</guid>
      <dc:creator>jeroen.van.halderen</dc:creator>
      <dc:date>2021-11-02T14:13:22Z</dc:date>
    </item>
    <item>
      <title>Re: Plugin languages comparison</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/plugin-languages-comparison/m-p/10730425#M23762</link>
      <description>&lt;P&gt;Thanks for the update, just two questions really:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;What order did you conduct the tests in i.e. did you intermingle tests for each programming language or run each batch one after the other e.g. did tests for VB.Net come at end after other languages?&lt;/P&gt;&lt;P&gt;What was the state of Revit between each test i.e. did you restart Revit at all or restart the system in general?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Given the path of travel of .Net I'd probably be choosing C# if starting out today.&lt;/P&gt;</description>
      <pubDate>Tue, 02 Nov 2021 14:24:59 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/plugin-languages-comparison/m-p/10730425#M23762</guid>
      <dc:creator>RPTHOMAS108</dc:creator>
      <dc:date>2021-11-02T14:24:59Z</dc:date>
    </item>
    <item>
      <title>Re: Plugin languages comparison</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/plugin-languages-comparison/m-p/10730914#M23763</link>
      <description>&lt;P&gt;I ran each sequence of 10 runs for each plugin one after the other, without restarting Revit or my computer in between. I only restarted Revit once after the first run of the VB.NET plugin because I closed Revit by mistake, however it didn't make a really big difference in execution time, so I think it's okay.&lt;/P&gt;</description>
      <pubDate>Tue, 02 Nov 2021 18:32:40 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/plugin-languages-comparison/m-p/10730914#M23763</guid>
      <dc:creator>jeroen.van.halderen</dc:creator>
      <dc:date>2021-11-02T18:32:40Z</dc:date>
    </item>
    <item>
      <title>Re: Plugin languages comparison</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/plugin-languages-comparison/m-p/10731233#M23764</link>
      <description>&lt;P&gt;This appear to be more what I'd expect to see especially between VB and C# as they should basically run identical in IL.&lt;/P&gt;</description>
      <pubDate>Tue, 02 Nov 2021 21:10:34 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/plugin-languages-comparison/m-p/10731233#M23764</guid>
      <dc:creator>Sean_Page</dc:creator>
      <dc:date>2021-11-02T21:10:34Z</dc:date>
    </item>
    <item>
      <title>Re: Plugin languages comparison</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/plugin-languages-comparison/m-p/10731572#M23765</link>
      <description>&lt;P&gt;Yes in the end it all ends up as MSIL. Perhaps in a slightly different form due to language but not to a significant extent regarding performance.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Below are the results I gathered. Using your code I compiled into three assemblies and invoked via an F# assembly. Each assembly was invoked in the order VB/CS/CPP 11 times. One set of results was discarded (debug hitting break mode due to&amp;nbsp;ContextSwitchDeadlock).&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="general"&gt;namespace RevitAddin

open System
open Autodesk.Revit.UI
open Autodesk.Revit.DB
open System.Reflection
open System.Collections.Generic
open System.Diagnostics
open System.Linq
open VB_Test
open RevitTestCS
open RevitTestCPP

[&amp;lt;Autodesk.Revit.Attributes.RegenerationAttribute(Autodesk.Revit.Attributes.RegenerationOption.Manual)&amp;gt;]
[&amp;lt;Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)&amp;gt;]
type EntryPoint1() =
  interface IExternalCommand with
    member x.Execute(commandData:Autodesk.Revit.UI.ExternalCommandData, message:byref&amp;lt;String&amp;gt;, elements:Autodesk.Revit.DB.ElementSet) =

        let IntUIDoc = commandData.Application.ActiveUIDocument 
        let IntDoc = commandData.Application.ActiveUIDocument.Document

        let vb = new VB_Test.Command()
        let cs = new RevitTestCS.Command()
        let cpp = new RevitTestCPP.Command()

        for i = 0 to 10 do
          vb.Execute(commandData, &amp;amp;message, elements) |&amp;gt; ignore
          cs.Execute(commandData, &amp;amp;message, elements) |&amp;gt; ignore
          cpp.Execute(commandData, &amp;amp;message, elements) |&amp;gt; ignore
              
        Result.Succeeded&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;Test_VB&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;Test_CS&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;Test_CPP&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Seconds&lt;/TD&gt;&lt;TD&gt;Milliseconds&lt;/TD&gt;&lt;TD&gt;Ticks&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;Seconds&lt;/TD&gt;&lt;TD&gt;Milliseconds&lt;/TD&gt;&lt;TD&gt;Ticks&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;Seconds&lt;/TD&gt;&lt;TD&gt;Milliseconds&lt;/TD&gt;&lt;TD&gt;Ticks&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;590&lt;/TD&gt;&lt;TD&gt;35909869&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;539&lt;/TD&gt;&lt;TD&gt;35398977&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;591&lt;/TD&gt;&lt;TD&gt;35916002&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;570&lt;/TD&gt;&lt;TD&gt;35708886&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;563&lt;/TD&gt;&lt;TD&gt;35632770&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;550&lt;/TD&gt;&lt;TD&gt;35503094&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;792&lt;/TD&gt;&lt;TD&gt;37927712&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;620&lt;/TD&gt;&lt;TD&gt;36206010&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;515&lt;/TD&gt;&lt;TD&gt;35157249&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;495&lt;/TD&gt;&lt;TD&gt;34956705&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;544&lt;/TD&gt;&lt;TD&gt;35446136&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;524&lt;/TD&gt;&lt;TD&gt;35249609&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;509&lt;/TD&gt;&lt;TD&gt;35098848&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;538&lt;/TD&gt;&lt;TD&gt;35384087&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;489&lt;/TD&gt;&lt;TD&gt;34898128&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;548&lt;/TD&gt;&lt;TD&gt;35482160&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;567&lt;/TD&gt;&lt;TD&gt;35675425&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;529&lt;/TD&gt;&lt;TD&gt;35294007&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;511&lt;/TD&gt;&lt;TD&gt;35115181&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;778&lt;/TD&gt;&lt;TD&gt;37784373&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;558&lt;/TD&gt;&lt;TD&gt;35589702&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;606&lt;/TD&gt;&lt;TD&gt;36065778&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;600&lt;/TD&gt;&lt;TD&gt;36006141&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;580&lt;/TD&gt;&lt;TD&gt;35802883&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;537&lt;/TD&gt;&lt;TD&gt;35378800&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;525&lt;/TD&gt;&lt;TD&gt;35251008&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;542&lt;/TD&gt;&lt;TD&gt;35423529&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;530&lt;/TD&gt;&lt;TD&gt;35308956&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;626&lt;/TD&gt;&lt;TD&gt;36269563&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;551&lt;/TD&gt;&lt;TD&gt;35512552&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Average&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;568.8&lt;/TD&gt;&lt;TD&gt;35695289.5&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;590&lt;/TD&gt;&lt;TD&gt;35905449&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;542.9&lt;/TD&gt;&lt;TD&gt;35434675.5&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 03 Nov 2021 01:38:10 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/plugin-languages-comparison/m-p/10731572#M23765</guid>
      <dc:creator>RPTHOMAS108</dc:creator>
      <dc:date>2021-11-03T01:38:10Z</dc:date>
    </item>
    <item>
      <title>Re: Plugin languages comparison</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/plugin-languages-comparison/m-p/10732529#M23766</link>
      <description>&lt;P&gt;Out of curiosity also tested F# and is slightly slower than the others. Tried with and without transaction using structure but slower result was the same.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Also found on this occasion C++ to be slower, bucking the trend (don't know why that was).&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I suppose in the end people will choose a language based on the features it offers.&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;FS&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;VB&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;CS&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Seconds&lt;/TD&gt;&lt;TD&gt;Milliseconds&lt;/TD&gt;&lt;TD&gt;Ticks&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;Seconds&lt;/TD&gt;&lt;TD&gt;Milliseconds&lt;/TD&gt;&lt;TD&gt;Ticks&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;Seconds&lt;/TD&gt;&lt;TD&gt;Milliseconds&lt;/TD&gt;&lt;TD&gt;Ticks&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;610&lt;/TD&gt;&lt;TD&gt;46104674&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;567&lt;/TD&gt;&lt;TD&gt;35675102&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;541&lt;/TD&gt;&lt;TD&gt;35412883&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;242&lt;/TD&gt;&lt;TD&gt;42423981&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;588&lt;/TD&gt;&lt;TD&gt;35889337&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;557&lt;/TD&gt;&lt;TD&gt;35570359&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;305&lt;/TD&gt;&lt;TD&gt;43057801&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;552&lt;/TD&gt;&lt;TD&gt;35525057&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;774&lt;/TD&gt;&lt;TD&gt;37741724&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;337&lt;/TD&gt;&lt;TD&gt;43375458&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;584&lt;/TD&gt;&lt;TD&gt;35847504&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;556&lt;/TD&gt;&lt;TD&gt;35563868&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;316&lt;/TD&gt;&lt;TD&gt;43165970&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;622&lt;/TD&gt;&lt;TD&gt;36229785&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;572&lt;/TD&gt;&lt;TD&gt;35727086&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;289&lt;/TD&gt;&lt;TD&gt;42898363&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;574&lt;/TD&gt;&lt;TD&gt;35746935&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;182&lt;/TD&gt;&lt;TD&gt;41821380&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;281&lt;/TD&gt;&lt;TD&gt;42814815&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;582&lt;/TD&gt;&lt;TD&gt;35825139&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;574&lt;/TD&gt;&lt;TD&gt;35744402&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;258&lt;/TD&gt;&lt;TD&gt;42583895&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;572&lt;/TD&gt;&lt;TD&gt;35727252&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;624&lt;/TD&gt;&lt;TD&gt;36248141&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;336&lt;/TD&gt;&lt;TD&gt;43365424&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;572&lt;/TD&gt;&lt;TD&gt;35727866&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;578&lt;/TD&gt;&lt;TD&gt;35784266&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;289&lt;/TD&gt;&lt;TD&gt;42898260&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;588&lt;/TD&gt;&lt;TD&gt;35886823&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;586&lt;/TD&gt;&lt;TD&gt;35869409&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Average&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;326.3&lt;/TD&gt;&lt;TD&gt;43268864.1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;580.1&lt;/TD&gt;&lt;TD&gt;35808080&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3.1&lt;/TD&gt;&lt;TD&gt;554.4&lt;/TD&gt;&lt;TD&gt;36548351.8&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;CPP&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Seconds&lt;/TD&gt;&lt;TD&gt;Milliseconds&lt;/TD&gt;&lt;TD&gt;Ticks&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;568&lt;/TD&gt;&lt;TD&gt;35687214&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;570&lt;/TD&gt;&lt;TD&gt;35703568&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;550&lt;/TD&gt;&lt;TD&gt;35507877&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;611&lt;/TD&gt;&lt;TD&gt;36118407&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;571&lt;/TD&gt;&lt;TD&gt;35716139&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;562&lt;/TD&gt;&lt;TD&gt;35622363&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;804&lt;/TD&gt;&lt;TD&gt;38046229&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;593&lt;/TD&gt;&lt;TD&gt;35937931&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;745&lt;/TD&gt;&lt;TD&gt;37451302&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;585&lt;/TD&gt;&lt;TD&gt;35852185&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;615.9&lt;/TD&gt;&lt;TD&gt;36164321.5&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="general"&gt;namespace FS_Test

open System
open Autodesk.Revit.UI
open Autodesk.Revit.DB
open System.Reflection
open System.Collections.Generic
open System.Diagnostics
open System.Linq

//[&amp;lt;Autodesk.Revit.Attributes.RegenerationAttribute(Autodesk.Revit.Attributes.RegenerationOption.Manual)&amp;gt;]
//[&amp;lt;Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)&amp;gt;]
type EntryPoint1() =
  //interface IExternalCommand with
    member public x.Execute(commandData:Autodesk.Revit.UI.ExternalCommandData, message:byref&amp;lt;String&amp;gt;, elements:Autodesk.Revit.DB.ElementSet) =
        let watch:Stopwatch = new Stopwatch()
        watch.Start()

        let IntUIDoc = commandData.Application.ActiveUIDocument 
        let IntDoc = commandData.Application.ActiveUIDocument.Document
        
        let plane:Plane = Plane.CreateByNormalAndOrigin(XYZ.BasisZ, XYZ.Zero)
        let Lst = new List&amp;lt;ElementId&amp;gt;()

        let TS:TransactionStatus  =
                   use Tx = new Transaction(IntDoc,"Transaction Name")
                   if(Tx.Start() = TransactionStatus.Started) then
                        for i = 1 to 1000 do
                            let sketchPlane:SketchPlane = SketchPlane.Create(IntDoc, plane)                  
                            let MC:ModelCurve = IntDoc.Create.NewModelCurve
                                                        (Line.CreateBound
                                                            (XYZ.Zero,XYZ.Zero + 
                                                                XYZ.BasisY.Multiply((float i))),sketchPlane)
                            Lst.Add(MC.Id)

                        Tx.Commit()
                   else
                       TransactionStatus.Uninitialized
                      
        
        
        let TS:TransactionStatus  =
                   use Tx = new Transaction(IntDoc,"Transaction Name")
                   if(Tx.Start() = TransactionStatus.Started) then
                        IntDoc.Delete(Lst) |&amp;gt; ignore
                        Tx.Commit()
                   else
                       TransactionStatus.Uninitialized    

        watch.Stop()
        Debug.WriteLine("Test_FS",watch.Elapsed.Seconds.ToString() + ":" + 
                            watch.Elapsed.Milliseconds.ToString() + ":" + 
                                watch.Elapsed.Ticks.ToString())


        Result.Succeeded&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 03 Nov 2021 12:39:33 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/plugin-languages-comparison/m-p/10732529#M23766</guid>
      <dc:creator>RPTHOMAS108</dc:creator>
      <dc:date>2021-11-03T12:39:33Z</dc:date>
    </item>
  </channel>
</rss>

